如何在Android的后台线程中显示Toast?

127

我该如何在线程中显示Toast消息?


这篇回答详细地解答了问题。 - mihirjoshi
此答案提供了最短的解决方案:https://dev59.com/tXXYa4cB1Zd3GeqP-MYG#18280318 - Oleksii K.
14个回答

0

onCreate 中的方法:

private void toastPublic(final String message){
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
       public void run() {
          Toast.makeText(getBaseContext(),""+message, 
             4 /*Toast.LENGTH_SHORT*/).show();
    }});
}

下一步:在线程内使用


0

Java 11:

var handler = new Handler(Looper.getMainLooper);
handler.post(() -> Toast.makeText(your_context, "Hi!", Toast.LENGTH_SHORT).show());

Java 8 中提供了 Lambda。Java 11 中引入了 var


0
与这里几乎所有的答案相反,Toast#makeTextToast#show不必在UI线程上运行,唯一的要求是它运行在调用了Looper#prepare的线程上。
原因是因为toast由操作系统处理和渲染,而不是应用程序。在内部,Toast#show会调用系统服务来排队toast。
这意味着以下代码是有效的。
private static class MyThread extends Thread {
    public Handler handler;

    @Override
    public void run() {
        Looper.prepare();

        handler = new Handler(Looper.myLooper()) {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };

        Looper.loop()
    }
}

final private MyThread t = new MyThread();
// start and wait for t to start looping

private void onClick() {
    t.handler.post(() -> Toast.makeText(this, "this works", Toast.LENGTH_SHORT).show());
}

0

我遇到了相同的问题:

E/AndroidRuntime: FATAL EXCEPTION: Thread-4
              Process: com.example.languoguang.welcomeapp, PID: 4724
              java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
                  at android.widget.Toast$TN.<init>(Toast.java:393)
                  at android.widget.Toast.<init>(Toast.java:117)
                  at android.widget.Toast.makeText(Toast.java:280)
                  at android.widget.Toast.makeText(Toast.java:270)
                  at com.example.languoguang.welcomeapp.MainActivity$1.run(MainActivity.java:51)
                  at java.lang.Thread.run(Thread.java:764)
I/Process: Sending signal. PID: 4724 SIG: 9
Application terminated.

之前:onCreate 函数

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
    }
});
thread.start();

在 onCreate 函数之后

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(), "Thread", Toast.LENGTH_LONG).show();
    }
});

它运行成功了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接