Dialog异常 Unable to add window, token not valid

15 篇文章 1 订阅
好记性不如烂笔头

问题描述

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 大概流程 Activity Activity Dialog Dialog 你要在 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 方法的回调等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值