Toast在子线程显示问题

在看捕捉全局异常unCaughtExceptionHandler时看到这段代码

//使用Toast来显示异常信息
    new Thread() {
        @Override
        public void run() {
            Looper.prepare(); 
            Toast.makeText(mContext, "出错了~~~", Toast.LENGTH_LONG).show();
            Looper.loop(); 
        }
    }.start();

那么问题来了,为什么加上 Looper.prepare(); Looper.loop(); 可以弹吐司?不是说非UI线程不能更新UI吗?而Toast show()真的是更新UI吗?

要想找到答案得去找Toast源码了 ,从源码得知Toast内部实现用到了Handler,而Handler创建依赖Looper(看源码,缺少looper则报错)

mLooper = Looper.myLooper();
    if (mLooper == null) {
        throw new RuntimeException(
            "Can't create handler inside thread that has not called Looper.prepare()");
    }
}

解决第一个问题,第二个问题参考http://blog.csdn.net/aigestudio/article/details/43449123

第三个问题

Toast使用的无所谓是不是主线程Handler,吐司操作的是window,不属于checkThread抛主线程不能更新UI异常的管理范畴。它用Handler只是为了用队列和时间控制排队显示吐司。

Android中,在子线程使用Toast会报错? - 回答作者: 森羴 http://zhihu.com/question/51099935/answer/125487934

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容