内存优化实战

时间:2022-07-24
本文章向大家介绍内存优化实战,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

最近,因为项目时间不紧的原因,就对项目的某些页面进行了内存观察,发现了两处优化点.特意记录下来

1.单例引发的内存泄漏

我在项目中涉及到的一个单例是这样的

object LiveCenter {
    ......
    var function: Function1<Boolean, Any>? = null

    fun registerListener(function: Function1<Boolean, Any>?) {
        this.function = function
    }
    ......
}

LiveCenter 注册了一个监听.这个 Function1 是在 Fragment 中 new 了一个实例.这个时候 LiveCenter 就持有了 Fragment 的引用导致内存泄漏.所以需要写一个 release 方法,在 release 方法中使 function = null 这个和常说的 Context 引发内存泄漏其实差不多.这个可以通过 Android Studio 自带的 Android Profiler.具体用法自己搜吧

2.Fragment 作为 Listener 引发的内存泄漏

有的时候为了方便我们会这么写

public class Instance {
    public Instance(Listener listener) {
        this.listener = listener;
    }
}

public class FragmentA extends BaseFragment implements Listener {
}

这么写很常见,如果只是 FragmentA 每 new 一次, Instance 也 new 一次.那么就没啥问题.但如果 FragmentA 对应的 Activity 是 SingleTask 模式.也就是说 FragmentA 可能会多次整个刷新,导致了每次都 new Instance.每次 new 就多了一个引用导致内存泄漏.所以在这种情况下一定要注意把那个 listener 置为 null