標籤:

Cant create handler inside thread that has not called Looper.prepare()

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

TAG:Android | 編程 | Bug |