繁体   English   中英

Handler或runOnUiThread解决方案“无法在未调用Looper.prepare()的线程内创建处理程序”

[英]Handler or runOnUiThread solution for “Can't create handler inside thread that has not called Looper.prepare() ”

最近,我在用户线程中出现了一个toast并得到了上面的运行时错误。

无法在未调用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();
        }
    });        
}

我想知道,与Handler相比,使用runOnUiThread有什么缺点吗?

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

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

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

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

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

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

实际上runOnUiThread()使用Handler里面。 因此,如果您想简单地在UI线程中发布一些工作,那么使用runOnUiThread()没有任何缺点。

如果你对HandlerrunOnUiThread()之间的区别感兴趣,你可以在这个答案中阅读它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM