在看捕捉全局异常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