WindowManager添加了一个View,在销毁activity时总是报"has leaked window"

正如大多数人所知道的dialog 是一种特殊的window 在activity销毁时 我们一般这样处理:

if (dialog!= null && dialog.isShowing()) {
    dialog .dismiss();
    dialog = null;
}

窗体泄露的原因:

因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,于是就产生了所谓的窗体泄露

解决方案:而WindowManager 的处理方式是:

if (mFloatView != null && mWindowManager != null) {
    mWindowManager.removeViewImmediate(mFloatView);
    mFloatView = null;
}

记住:要用removeViewImmediate(),而不是remove();

removeViewImmediate()是通知View立刻调用View.onDetachWindow(),这说明这个方法是通过一个监听或者观察者来实现的。此外除了在ondestroy()中使用,其它时候要小心使用此方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值