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()中使用,其它时候要小心使用此方法。

猜你喜欢

转载自blog.csdn.net/qq_39897005/article/details/80409253