一次Dialog导致的内存泄漏
今天上午10:30来到公司后,一头扎进了张鸿洋大神所写的OkHttpUtils源码中去,继续昨晚未完成的任务,11:30后,终于对整个框架有了一个比较全局、清晰的了解,心里更是对大神充满满满的崇拜和敬意;然后回到公司的工作,打开jira,发现距离我两个工位的美女测试姐姐给我提了一个页面刷新bug,卧槽,居然还有bug,赶紧拿起数据线,插上Mac电脑和华为荣耀6手机,进入bug页面,执行相关操作,程序按正常逻辑自动退出进入上一层页面,检查应该刷新的两个页面,发现通过EventBus通知刷新的页面都刷新了,没问题啊,嗯嗯…?好像刚才执行点击操作时,在页面退出之前,手机屏幕好像出现了短暂的黑屏现象,确认应该没看错,赶紧打开Android Studio的log日志,发现如下:
我靠,居然发生了内存泄漏,按照日志调用栈的信息,应该是Activity在退出finish后,Dialog仍然持有Activity的引用,从而导致内存泄漏。
但是我明明已经调用了dialog.dismiss()方法了,这个Dialog与Activity应该没有关联引用了,怎么仍然持有引用?
下面是执行点击操作,弹出Dialog的代码
final TitleContentDialog dialog = new TitleContentDialog(ReceivableMoneyRecordActivity.this);
dialog.setContentView(getContentViewForDialog("确认删除此回款记录?"));
dialog.setTitle(null);
dialog.setCancelButton("取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.setConfirmButton("确定", new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
deleteRecord();
}
});
dialog.show();
可以看出点击确定后,dialog先是dismiss(),然后执行deleteRecord()方法,deleteRecord()里面执行请求网络的删除操作。
打开浏览器,输入问题,都说是Activity finish时,Dialog仍然可见,要在Activity的onDestroy()方法中,确保已经关闭了Dialog,
OK,那我就在onDestroy()方法里面校验Dialog,我把Dialog提取出方法,成为Activity的一个成员变量mDeleteDialog;
同时重写Activity的onDestroy()方法:
@Override
protected void onDestroy() {
//防止内存泄漏
if (mDeleteDialog.isShowing()) {
mDeleteDialog.dismissImmediately();
}
mDeleteDialog = null;