在看捕捉全局異常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內(nèi)部實(shí)現(xiàn)用到了Handler寞埠,而Handler創(chuàng)建依賴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