Cant create handler inside thread that has not called Looper.prepare()
來自專欄 一起來學Android
今天寫android的時候,在子線程中使用了以下的代碼:
Toast.makeText(act, "", Toast.LENGTH_LONG) .show();
然後報錯:
java.lang.RuntimeException: Cant create handler inside thread that has not called Looper.prepare()// at android.os.Handler.<init>(Handler.java:121)// at android.widget.Toast$TN.<init>(Toast.java:361)// at android.widget.Toast.<init>(Toast.java:97)// at android.widget.Toast.makeText(Toast.java:254)
這我就覺得非常奇怪,明明之前用這個方法是不會出錯了,怎麼突然就讓我的程序崩潰了呢??
之後查閱資料,並看了一下源代碼之後發現,原來主線程中的makeText會自動創建一個looper對象。但是子線程不會,需要手動創建,所以當我們在子線程中直接調用makeText會報錯。
解決辦法:
一、創建一個Looper.prepare()。
Looper.prepare(); Toast.makeText(act, "", Toast.LENGTH_LONG) .show(); Looper.loop();// 進入loop中的循環,查看消息隊列
二、post給主線程。
mainHandler.post(new Runnable() { @Override public void run() { if (toast == null) { toast = Toast.makeText(context, "", Toast.LENGTH_SHORT); } toast.setText(msg); toast.setDuration(Toast.LENGTH_SHORT); toast.show(); }});
推薦閱讀:
※7.18
※定時器setTimeout()的小秘密
※字元串(方法)
※Python 中的那些中文分詞器
※面向新手的雜談:Flyweight