在Android的Java Websocket服务器上收到消息时未创建Toast消息

问题描述

我正在尝试使用 this 库创建基本的WebSocket服务器。 我想在收到消息时做一个祝酒消息。 在下面的onMessage()函数中,我已经实现了。但是没有吐司消息发生。

但是收到的消息会打印在控制台上。

        WebSocketServer ws = new WebSocketServer(new InetSocketAddress(3000)) {

        @Override
        public void onopen(WebSocket conn,ClientHandshake handshake) {
            conn.send("Hello world");
        }

        @Override
        public void onClose(WebSocket conn,int code,String reason,boolean remote) {

        }

        @Override
        public void onMessage(WebSocket conn,String message) {
            System.out.println("Recieved: "+message);
            Toast.makeText(MainActivity.this,"Recieved: " + message,Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(WebSocket conn,Exception ex) {

        }

        @Override
        public void onStart() {

        }
    };
    ws.start();
}

解决方法

我认为您必须切换到UI线程才能显示Toast。

您可以尝试使用Handler

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        Toast.makeText(MainActivity.this,"Received: " + message,Toast.LENGTH_SHORT).show();
    }
});

或致电runOnUiThread

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(MainActivity.this,Toast.LENGTH_SHORT).show();
    }
});

或广播消息:

@Override
public void onMessage(WebSocket conn,String message) {
    System.out.println("Recieved: "+message);

    Intent intent = new Intent("msgReceived");
    intent.putExtra("message",message);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

并在您的活动中注册BroadcastReceiver:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context,Intent intent) {
        String message = intent.getExtras().getString("message");
        Toast.makeText(MainActivity.this,Toast.LENGTH_SHORT).show();
    }
};

@Override
protected void onStart() {
    super.onStart();
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,new IntentFilter("msgReceived"));

@Override
protected void onStop() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onStop();
}