如果你們有用第三方庫(kù)檢測(cè)泄漏,經(jīng)常出現(xiàn)一種因?yàn)樽远x的Callback或者Listener引起的泄漏病毡。
那么這篇文章就是用白話解釋為什么會(huì)存在這種泄漏克胳,以及如何解決
一:為什么存在這種泄漏?
大家都知道臼勉,java會(huì)自動(dòng)釋放對(duì)象
內(nèi)存
,但是如果該對(duì)象一直被別的對(duì)象持有餐弱,那么該對(duì)象是不會(huì)自動(dòng)釋放的宴霸,當(dāng)該對(duì)象在不停的創(chuàng)建后,然后中間一直沒有釋放出來岸裙,就會(huì)導(dǎo)致內(nèi)存溢出猖败,這就是內(nèi)存泄漏的問題。
像這種內(nèi)存很大的問題往往是Activity對(duì)象降允,因?yàn)锳ctivity的Callback或者Listener對(duì)象,被別的全局類持有著艺糜,當(dāng)Activity對(duì)象關(guān)閉后剧董,但是Activity的Callback對(duì)象依然被別的全局類持有著,所以導(dǎo)致不會(huì)自動(dòng)釋放Activity破停,然后該Activity不停的打開關(guān)閉打開翅楼,就會(huì)產(chǎn)生內(nèi)存溢出。
二:如何解決真慢?
其實(shí)很簡(jiǎn)單毅臊,就是在該Activity關(guān)閉后,把該Activity的Callback對(duì)象設(shè)置為null即可黑界,原理很簡(jiǎn)單管嬉,因?yàn)镃allback為null了后面會(huì)自動(dòng)被釋放皂林,而Activity沒有任何對(duì)象被別的全局類持有,所以Activity后面也會(huì)被自動(dòng)釋放
三:例子
一個(gè)全局類(范圍比Activity大)
public void registerViewCallback(Callback callback) {
this.callback = callback;
}
public void unRegisterViewCallback(Callback callback) {
this.callback = null;
}
Activity,不一定是onBackPressed蚯撩,也可以是onDestroy础倍,根據(jù)業(yè)務(wù)來
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
playerPresenter.registerViewCallback(this);
}
@Override
public void onBackPressed() {
playerPresenter.unRegisterViewCallback(this);
super.onBackPressed();
}