最近,因为项目时间不紧的原因,就对项目的某些页面进行了内存观察,发现了两处优化点.特意记录下来
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
网友评论