正如大多数人所知道的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()中使用,其它时候要小心使用此方法。