内存泄漏 - 用白话解释Android常见内存泄漏之一

如果你们有用第三方库检测泄漏,经常出现一种因为自定义的Callback或者Listener引起的泄漏。

那么这篇文章就是用白话解释为什么会存在这种泄漏,以及如何解决

一:为什么存在这种泄漏?

大家都知道,java会自动释放对象 内存,但是如果该对象一直被别的对象持有,那么该对象是不会自动释放的,当该对象在不停的创建后,然后中间一直没有释放出来,就会导致内存溢出,这就是内存泄漏的问题。

像这种内存很大的问题往往是Activity对象,因为Activity的Callback或者Listener对象,被别的全局类持有着,当Activity对象关闭后,但是Activity的Callback对象依然被别的全局类持有着,所以导致不会自动释放Activity,然后该Activity不停的打开关闭打开,就会产生内存溢出。

二:如何解决?

其实很简单,就是在该Activity关闭后,把该Activity的Callback对象设置为null即可,原理很简单,因为Callback为null了后面会自动被释放,而Activity没有任何对象被别的全局类持有,所以Activity后面也会被自动释放

三:例子

一个全局类(范围比Activity大)

    public void registerViewCallback(Callback callback) {
        this.callback = callback;
    }
    public void unRegisterViewCallback(Callback callback) {
        this.callback = null;
    }

Activity,不一定是onBackPressed,也可以是onDestroy,根据业务来

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        playerPresenter.registerViewCallback(this);
    }

    @Override
    public void onBackPressed() {
        playerPresenter.unRegisterViewCallback(this);
        super.onBackPressed();
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容