Android Toast顯示 Can't create handler inside thread that has not called Looper.prepare()問題
阿新 • • 發佈:2018-12-10
今天在開發的時候 在子執行緒中呼叫了一個Toast結果報錯 Can’t create handler inside thread that has not called Looper.prepare() 錯誤程式碼示例:
public void showToast(final Context context){ new Thread(){ @Override public void run() { super.run(); Toast.makeText(context,"toast顯示成功",Toast.LENGTH_LONG).show(); } }.start();
抓到的錯誤: 注意 :有些機型能抓到Can’t create handler inside thread that has not called Looper.prepare()錯誤 然後直接崩潰 而有的機型是沒有錯誤直接不顯示 Toastd的 一般如果不是在主執行緒中又開啟了新執行緒的話,一般都會碰到這個問題
錯誤的原因: 因為Toast的實現需要在Activity的主執行緒才能正常工作,所以非主執行緒不能使Toast顯示在Actvity上; 通過自定義執行緒運行於主執行緒,這樣使得Toast在子執行緒上執行,而Toast 顯示需要出現在一個執行緒的MessageQueue訊息佇列中,但是在建立新執行緒的時候預設情況下不會去建立新的MessageQueue,所以導致Toast無法顯示。
解決辦法: 其實解決辦法很簡單
Looper.prepare();
Toast.makeText(context,"toast顯示成功",Toast.LENGTH_LONG).show();
Looper.loop();
加上這兩句就行了 因為Looper.prepare();的作用是在當前執行緒建立一個MessageQueue訊息佇列 ; 上面我們也說了 Toast 顯示需要出現在一個執行緒的MessageQueue訊息佇列中,建立子執行緒預設是不自動建立MessageQueue,那我們自己建立一個 讓Toast 得以顯示出來