Dialog異常 Unable to add window, token not valid

好記性不如爛筆頭

問題描述

Activity 延時顯示 Dialog ,在顯示之前, Activity 已經銷燬
報錯 Unable to add window -- token android.os.BinderProxy@e6ee7d8 is not valid; is your activity running?

如下

問題分析

錯誤信息很明確,是沒有 token 導致的. 而 token 一般只有 Activity 纔有.當 Activity 銷燬後,Dialog初始化AlertDialog.Builder builder = new AlertDialog.Builder(this);此時的 this 已經 is not valid

Created with Raphaël 2.1.0大概流程ActivityActivityDialogDialog你要在 5 秒後顯示我銷燬了(onDestroy),此時才 3 秒過去好,5 秒到了我要初始化了,需要你傳遞自身對象發現缺少 token 崩潰

問題解決
1.1 最常用的方法就是在顯示之前做判斷(不能100%保證成功)

 private void showDialog() {
        if (isFinishing()){//判斷 activity 是否銷燬
            return;
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        AlertDialog dialog = builder.setTitle("我是dialog").show();
        dialog.show();
    }

1.2 如果是 Handler 延時引起的 可以這樣

 @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);// removed
    }

1.3 針對 AsyncTask , Api 回調同 1.2 思路


備註

1 不要認爲 Activity 銷燬(onDestroy) 後其中的方法就不會觸發了
2 Dialog 本質是一個 window ,而且不是系統級別的,所以跟 Activity 有密切關聯
3 引起延時顯示的原因很多 Handler,AsyncTask 方法的回調等

發佈了53 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章