Dialog.setOnDismissListener 引发的内存泄漏 以及解决方案

978 阅读1分钟

问题的现象

自动化测试中反馈了一个页面存在内存泄漏的现象,几乎是必现,我们本地debug跑了一下 发现问题 确实存在

image.png

一看这个就明白了 是个匿名内部类导致的。

问题的定位

好在现在高版本的Android studio 内存这块做的已经很出色,不用像以前那样还要转hprof格式以后 用mat 分析 我们直接右键jump to source 就可以

image.png

一看 这不就是个dialog的 listener吗,这也会内存泄漏? 再看下 前面的 调用链,还和message有关系?

会不会是android stuido 误报呢?

再看看源码吧:

image.png

嗯? 这里一个setListener的操作 竟然还真的会和handler和message 有关系? 那看来 studio 没有误报呀 大概率就是这个地方了

怎么解决?

当然是先谷歌一番了,什么dialog dismiss, setOnDismissListener(null) 都试过了,好像并没有什么用 咋办?

android 匿名内部类的内存问题 遇事不决就 弱引用呀

static class CommentDelDialogDismissListener implements DialogInterface.OnDismissListener {

        private final WeakReference<ForumPostDetailActivity> mActivity;

        CommentDelDialogDismissListener(ForumPostDetailActivity activity) {
            mActivity = new WeakReference<>(activity);
        }


        @Override
        public void onDismiss(DialogInterface dialog) {
            ForumPostDetailActivity activity = mActivity.get();
            if (activity == null) {
                return;
            }
            activity.continueVideoPlayerByVisiableRect();
        }
    }

是不是和标准的static class CustomHandler方法 很像。

运行之后 发现 内存泄漏的情况消失。问题解决