mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException("Can't create handler inside thread that has not called Looper.prepare()");
}
使用Handler時要對Looper進行初始化的,Toast.makeText().show()方法裏面(源碼裏面)建立了一個handler,因此須要Looper的初始化,可是Android系統幫咱們實現了主線程(也就是UI線程中)的Looper初始化。因此在子線程中要使用Toast.makeText方法須要本身Looper的初始化,或者想辦法把其運行在主線程中。有兩個方法:android
1.在子線程中添加以下兩個方法ide
Looper.prepare();//給當前線程初始化Looperoop
Toast.makeText().show();//Toast初始化的時候會new Handler(),無參構造默認獲取當前線程的Looper, 若是沒有prepare過,則拋出題主描述的異常。spa
Looper.loop() //最後調用,這種辦法會終止子線程以後的代碼, Looper.loop()裏面是一個死循環。這樣的話,會致使進程裏面的線程愈來愈多,這個是不推薦的。線程
2.在主線程中創建一個重寫了handleMessge()方法的android.os.Handler,而後在子線程中調用handle.handleMessge()(傳入想要吐司吐出的內容便可)方法,而後會在主線程中重寫handleMessge()方法中執行具體內容(在這裏面調用Toast.makeText().show()方法便可)。進程