2012-02-28 79 views
3

最近,我在用户线程中显示了一个toast,并得到了上述运行时错误。Handler或runOnUiThread解决方案“无法在未调用Looper.prepare()的线程中创建处理程序”

Can't create handler inside thread that has not called Looper.prepare(),他们建议使用Handler作为解决方案。但是,我看到解决方案非常冗长和繁琐。

我自己的解决方案是使用runOnUiThread

private void showTooDarkToastMessage() 
{ 
    ((Activity) this.getContext()).runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast toast = Toast.makeText(getContext(), getResources().getString(R.string.toast_toodark), Toast.LENGTH_LONG); 
      toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
      toast.show(); 
     } 
    });   
} 

我想知道,有没有使用runOnUiThread的任何缺点,相对于Handler

+0

了解它,你仍然得到错误? – user936414 2012-02-28 03:57:29

回答

0

因为您显示的是UI元素(Toast消息),所以runOnUiThread是完美的。

处理程序将在指定的线程上运行其任务。例如,

 protected void onCreate(Bundle savedInstanceState) 
    { 
     Handler hander = new Handler(); 
     //Create thread, post to handler 
    } 

将创建一个新的处理程序,它将在UI线程上运行其帖子。调用Activiy.runOnUiThread只是专门向UI线程发布runnable。默认情况下,处理程序将在任何创建它们的线程上运行。上面的代码与使用runOnUiThread的工作方式相同,因为onCreate方法在UI线程上运行!

  • 如果您需要在多个后台线程之间进行通信,则首选处理程序。

  • 由于移动设备资源有限,因此在UI线程上运行的工作应该保持相对较低的水平。在UI线程上完成的大量工作可能会导致应用程序无响应(ANR)错误,并可能导致操作系统终止进程。

0

其实runOnUiThread()使用Handler里面。所以,如果你想在UI线程中简单地发布一些工作,那么使用runOnUiThread()就没有缺点。

如果您在Handler之间的区别有趣runOnUiThread()您可以在this answer