您的位置:首页 > 移动开发 > Android开发

android.view.WindowLeaked窗体泄露异常的解决方案

2016-08-10 16:27 525 查看
android.view.WindowLeaked窗体泄露异常的解决方案:

Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢?

产生原因:

我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,所以当某个Dialog或者某个PopupWindow正在显示的时候我们去finish()了承载该Dialog(或PopupWindow)的Activity时,就会抛Window Leaked异常了,因为这个Dialog(或PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

解决方法:

关闭(finish)某个Activity前,要确保附属在上面的Dialog或PopupWindow已经关闭(dismiss)了。

上面的你如果遇到了,很容易解决!但是我在开发中,却不是这个原因,我的原因是一直提示在MainActivity里面出现窗体溢出,我在MainActivity里面有几个fragment,在fragment里面用到了dialog,我是很规律的先调用show,然后dismiss。MainActivity也没有让他消失finish.

后来我发现,我在MainActivity里面调用了这个方法导致的

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


FLAG_ACTIVITY_NEW_TASK如果设置了此标志,这个activity将成为一个新task的历史堆栈中的第一个activity。这个task定义了一个原子组activities,用户可以对其进行移除。各种tasks可以移到前面或者后面;在一个特定的task中,所有的activities总是保持相同的顺序。

上面的解释就是MainActivity重新创建了,那么原来的MainActivity被finish了,但是dialog没有先被dismiss,这样子就造成了android.view.WindowLeaked窗体泄露异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息