【问题标题】:I cant see my Toast messages in new Thread(new Runnable()我在新线程中看不到我的 Toast 消息(new Runnable()
【发布时间】:2016-07-13 13:51:27
【问题描述】:

我在连接和断开连接后显示消息时遇到了一点问题。

我正在尝试按下我的连接按钮并在新线程中建立通信以获取 toast 消息:您已连接,如果我未连接以获取异常中的 toast:您未连接。

我尝试用

替换新线程

runOnUiThread(new Runnable() /*but then It underline*/}).start(); 在我的代码末尾是一个错误。当我删除启动并运行应用程序时,它无法连接到我的服务器。

我尝试了许多解决方案,但没有一个有效。如果您能帮助我,我将非常感激。

 @Override
  public void onClick(View v) {

    new Thread(new Runnable() {
        @Override
        public void run() {
          try {
            server = serverTxt.getText().toString();
                Socket socket = new Socket(server, port);
                socket.setSoTimeout(30000);
                connected = true;
                Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show();
            //send the message to the server
                here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            } catch (Exception e) {
                  Toast.makeText(getApplicationContext(), "You are not connected",Toast.LENGTH_LONG).show();
            }
        }
     }).start();
    }
   });

【问题讨论】:

  • 您是否要在 Fragment 中执行此操作?
  • 1) 在 runOnUiThread 调用之后你不需要 .start() 。 2) 尝试在 runOnUiThread 中使用套接字代码可能会抛出 NetworkOnMainThread 异常 -> 仅使用 toast 部分

标签: android multithreading exception tcp toast


【解决方案1】:

您必须在 UI 线程上显示 Toast。您可以使用 Handler 来执行此操作。

Handler handler = new Handler(Looper.getMainLooper());
handler.postRunnable(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show();
    }
});

【讨论】:

  • 不要为 ui 使用应用程序上下文
  • postRunnable 带有下划线
  • 应该只是 post(),抱歉。
  • 我试过了,但它不起作用。我的代码在片段中,我也有 NFC 通信。我不知道有什么不同
【解决方案2】:

你必须按如下方式使用runOnUiThread:

不要尝试在 UI 线程中使用套接字部分,它会抛出异常

new Thread(new Runnable() {
@Override
public void run() {
  try {
    server = serverTxt.getText().toString();
        Socket socket = new Socket(server, port);
        socket.setSoTimeout(30000);
        connected = true;

     //if inside a fragment, call with getActivity().runOnUiThread()
     Activity.this.runOnUiThread(new Runnable(){

        public void run(){

            Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show();

        }
     });
    //send the message to the server
        here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

    } catch (Exception e) {

     //if inside a fragment, call with getActivity().runOnUiThread()
     Activity.this.runOnUiThread(new Runnable(){

        public void run(){

            Toast.makeText(getApplicationContext(), "You are not connected",Toast.LENGTH_LONG).show();

        }
     });

    }
}

}).start();

runOnUiThread 是一种方法。 .start() 仅适用于 Thread 对象,用于启动新线程。在这里,您希望您的 ui(已经运行)线程获得焦点:)

【讨论】:

  • 我尝试了代码但是当我没有连接时不会出现 toast
  • 插座部分在哪里可以使用?
  • 查看完整答案。这对你有用:)
  • 只有当您的套接字抛出异常时才会显示您未连接。否则不会显示
【解决方案3】:

考虑使用 AsyncTask。在 onPostExecute 中,您可以访问 UI 并可以发出 Toast 通知

private class operation extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            try {
                server = serverTxt.getText().toString();
                Socket socket = new Socket(server, port);

                socket.setSoTimeout(30000);
                connected = true;

                return "You are connected";
                //send the message to the server
                here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            } catch (Exception e) {
                return "You are not connected"

            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
           Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
        }

    }

【讨论】:

    【解决方案4】:

    你应该在方法runOnUiThread中使用它。

    例如:

    activity.this.runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(getApplicationContext(), "Message", Toast.LENGTH_SHORT).show();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 2019-06-01
      • 2018-03-02
      • 2011-05-11
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多