在Android线程中显示祝酒词

在Android线程中显示祝酒词,android,multithreading,toast,android-context,Android,Multithreading,Toast,Android Context,可能重复: 我正在尝试使用标准方法显示线程中的吐司: Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show(); 在正常情况下,这当然是可行的。但当我尝试从单独的线程调用时,我有一个例外: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 我完全不知道这是什么意思 我

可能重复:

我正在尝试使用标准方法显示线程中的吐司:

Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();
在正常情况下,这当然是可行的。但当我尝试从单独的线程调用时,我有一个例外:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
我完全不知道这是什么意思

我传递的上下文值是应用程序本身(应用程序从上下文继承)或
应用程序。getApplicationContext()

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

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

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

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

您不能直接从后台线程操作UI。一种解决方案是使用对象在线程之间进行通信,并让它为您显示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的信号。

问题与此处相同:此错误意味着Toast消息需要回调以在将来删除Toast,但此线程尚无法执行此操作。您可以在此线程中准备并启动循环器,以便调用use回调,但随后您会发现您无法在其他线程中与UI交互…-1,因为“[此]问题未显示任何研究工作。”将为您提供答案。没有找到任何答案亲爱的先生。唯一的问题是在线程UI中执行代码,这使得不可能计算任何需要花费太多时间的事情。事实上,打破线程的优势。我想你指的是活动。rununuithread()?无论如何,这是可行的,但这是不可接受的,因为我阻止UI线程太长了。对。但我不明白阻拦和它有什么关系。Toast不是进度指示器-它在超时后会自动消失。Toast.makeText/show不阻塞,它会立即返回。阻塞操作可能会在线程上继续。我完全看不出这种方法有什么好处。它将调用run()方法,然后?我可以创建任何dummy()方法并在活动中调用它。线程的兴趣在于能够进行长时间的计算,或者诸如此类的计算。为什么首先需要干杯呢?表示长时间的计算刚刚开始?然后显示启动工作线程的同一主线程代码中的toast,而不是线程内部的toast。非常好的解决方案。。