1. 程式人生 > >Android Toast顯示 Can't create handler inside thread that has not called Looper.prepare()問題

Android Toast顯示 Can't create handler inside thread that has not called Looper.prepare()問題

今天在開發的時候 在子執行緒中呼叫了一個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 得以顯示出來