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

你可能感兴趣的:(Toast在子线程显示问题)