好記性不如爛筆頭
問題描述
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
問題解決
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
方法的回調等