如果你们有用第三方库检测泄漏,经常出现一种因为自定义的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();
}