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

huangapple go评论95阅读模式
英文:

Toast Message is not created when message received at Java Websocket server in Android

问题

我正在尝试使用 这个 库创建基本的WebSocket服务器。
当接收到消息时,我想要显示一个提示消息。
在下面的onMessage()函数中,我已经实现了这一点。但是没有显示提示消息。

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

  1. WebSocketServer ws = new WebSocketServer(new InetSocketAddress(3000)) {
  2. @Override
  3. public void onOpen(WebSocket conn, ClientHandshake handshake) {
  4. conn.send("Hello world");
  5. }
  6. @Override
  7. public void onClose(WebSocket conn, int code, String reason, boolean remote) {
  8. }
  9. @Override
  10. public void onMessage(WebSocket conn, String message) {
  11. System.out.println("Received: " + message);
  12. Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show();
  13. }
  14. @Override
  15. public void onError(WebSocket conn, Exception ex) {
  16. }
  17. @Override
  18. public void onStart() {
  19. }
  20. };
  21. ws.start();
英文:

I am trying to create basic WebSocket server with this library.
I want to make a toast message when a message is received.
In onMessage() function below I have implemented that. But no toast message is happening.

But Received message is printed on console.

  1. WebSocketServer ws = new WebSocketServer(new InetSocketAddress(3000)) {
  2. @Override
  3. public void onOpen(WebSocket conn, ClientHandshake handshake) {
  4. conn.send("Hello world");
  5. }
  6. @Override
  7. public void onClose(WebSocket conn, int code, String reason, boolean remote) {
  8. }
  9. @Override
  10. public void onMessage(WebSocket conn, String message) {
  11. System.out.println("Recieved: "+message);
  12. Toast.makeText(MainActivity.this, "Recieved: " + message, Toast.LENGTH_SHORT).show();
  13. }
  14. @Override
  15. public void onError(WebSocket conn, Exception ex) {
  16. }
  17. @Override
  18. public void onStart() {
  19. }
  20. };
  21. ws.start();
  22. }

答案1

得分: 0

我认为你需要切换到UI线程来显示Toast。

你可以尝试使用Handler

  1. new Handler(Looper.getMainLooper()).post(new Runnable() {
  2. public void run() {
  3. Toast.makeText(MainActivity.this, "接收到消息:" + message, Toast.LENGTH_SHORT).show();
  4. }
  5. });

或者调用runOnUiThread

  1. runOnUiThread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Toast.makeText(MainActivity.this, "接收到消息:" + message, Toast.LENGTH_SHORT).show();
  5. }
  6. });

或者广播消息:

  1. @Override
  2. public void onMessage(WebSocket conn, String message) {
  3. System.out.println("接收到消息:" + message);
  4. Intent intent = new Intent("msgReceived");
  5. intent.putExtra("message", message);
  6. LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
  7. }

然后在你的Activity中注册一个BroadcastReceiver:

  1. private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String message = intent.getExtras().getString("message");
  5. Toast.makeText(MainActivity.this, "接收到消息:" + message, Toast.LENGTH_SHORT).show();
  6. }
  7. };
  8. @Override
  9. protected void onStart() {
  10. super.onStart();
  11. LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("msgReceived"));
  12. }
  13. @Override
  14. protected void onStop() {
  15. LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  16. super.onStop();
  17. }
英文:

I think you have to switch to the UI thread to show the Toast.

You can try using a Handler:

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

Or calling runOnUiThread:

  1. runOnUiThread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show();
  5. }
  6. });

Or broadcasting the message:

  1. @Override
  2. public void onMessage(WebSocket conn, String message) {
  3. System.out.println("Recieved: "+message);
  4. Intent intent = new Intent("msgReceived");
  5. intent.putExtra("message", message);
  6. LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
  7. }

And registering a BroadcastReceiver in your Activity:

  1. private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String message = intent.getExtras().getString("message");
  5. Toast.makeText(MainActivity.this, "Received: " + message, Toast.LENGTH_SHORT).show();
  6. }
  7. };
  8. @Override
  9. protected void onStart() {
  10. super.onStart();
  11. LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("msgReceived"));
  12. @Override
  13. protected void onStop() {
  14. LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  15. super.onStop();
  16. }

huangapple
  • 本文由 发表于 2020年9月20日 05:09:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/63973393.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定