Android异常之窗体泄漏Window Leaked

3,598 阅读1分钟

窗体泄漏

最近新发布的版本中出现了 Crash,看 log 中是 Window Leaked,下面提供一下解决方案

原因

关于窗体泄漏的原因很简单。当我们在 Activity 上去构建一个置于 Activity 之上的 Dialog 或者 PopupWindow 时,这个窗口会依赖于 Activity。如果在浮窗没有被 dismiss 时,Activity 被 finish,就会出现 Window Leaked。知道了问题原因,就很好解决了。

解决方案

共有两种解决思路,第一种是手动做一个判断处理。第二种是使用 onCreateDialog 方法让系统去管理。

手动处理

手动处理也很方便,就是我们对它做一个判断就可以了。

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 处理内存泄漏中的窗体泄漏问题,即:位于Activity之上的窗体依附于Activity展示(如Dialog、Popup等),在它们还在时,依附的Activity没了引起
        if (progressDialog != null) {
            progressDialog.dismiss();
        }
    }

系统管理

在 Activity 中重写 onCreateDialog 方法,通过该方法让系统对其管理

	@Override
	protected Dialog onCreateDialog(int id) {
	    Dialog dialog = new Dialog(this);
	    return dialog;
}

这里简单记录一下问题处理