在Android线程中显示Toast

时间:2013-01-23 22:35:14

标签: android multithreading toast android-context

  

可能重复:
  Android: Toast in a 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本身(Application继承自Context)或Application.getApplicationContext()

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

2 个答案:

答案 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的信号。