-1

可能重复:
Android:线程中的吐司

我正在尝试使用标准方法在 Thread 中显示 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.getApplicationContext().

顺便说一句,我也完全不知道为什么会有这个多余的东西。应用程序(它本身已经是一个上下文)和Application.getApplicationContext().

4

2 回答 2

8

您不能做任何影响工作线程 UI 的事情 - 包括显示 toast。用于Activity.runOnUiThread()在主线程上执行该行。像这样:

MyActivity.runOnUiThread(new Runnable()
{
    public void run()
    {
        Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();
    }
});

或者使用Handler在主线程及其post()方法上创建的对象。非常相似的语法。

于 2013-01-23T22:37:07.837 回答
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 的信号。

于 2013-01-23T23:49:23.760 回答