我正在尝试使用标准方法在线程中显示Toast:
Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();
正常情况下,这是当然有效的。但是当我尝试从一个单独的线程调用时,我有一个例外:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我完全不知道这意味着什么。
我传递的上下文值是Application本身(Application继承自Context)或Application.getApplicationContext()
。
顺便说一下,我也完全不知道为什么会有这个多余的东西。
应用程序(它本身已经是一个Context)
和Application.getApplicationContext()
。
答案 0 :(得分:8)
你不能做任何影响工作线程UI的事情 - 包括显示祝酒词。使用Activity.runOnUiThread()
在主线程上执行该行。像这样:
MyActivity.runOnUiThread(new Runnable()
{
public void run()
{
Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();
}
});
或者使用在主线程及其Handler
方法上创建的post()
对象。非常相似的语法。
答案 1 :(得分:0)
您无法直接从后台线程操纵UI。一种解决方案是使用Handler对象在线程之间进行通信,并让它为您显示Toast。像这样:
Handler h = new Handler() {
public void handleMessage(Message msg){
if(msg.what == 0){
Toast.makeText(context, "HelloWorld!", Toast.LENGTH_SHORT).show();
}
}
};
然后在你的后台线程中你可以使用它:
h.sendEmptyMessage(0);
发送您准备好显示Toast的信号。