好记性不如烂笔头
问题描述
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
方法的回调等