做網(wǎng)站流程營(yíng)銷推廣軟文案例
案例2——hprof文件顯示出Fragment內(nèi)存泄漏
接下來我們來看fragment內(nèi)存泄漏,老規(guī)矩查看fields和references,確保它符合內(nèi)存泄漏的情形;我們點(diǎn)擊jump to source查看泄漏的位置
Fragment#MZBannerView#內(nèi)部類Runnbale
/*** Banner 切換時(shí)間間隔*/
private int mDelayedTime = 5000;
private final Runnable mLoopRunnable = new Runnable() {@Overridepublic void run() {if (mIsAutoPlay) {mCurrentItem = mViewPager.getCurrentItem();mCurrentItem++;if (mCurrentItem > mAdapter.getCount() - 1) {mCurrentItem = 0;mViewPager.setCurrentItem(mCurrentItem, false);mHandler.postDelayed(this, mDelayedTime);} else {mViewPager.setCurrentItem(mCurrentItem);mHandler.postDelayed(this, mDelayedTime);}} else {mHandler.postDelayed(this, mDelayedTime);}}};
可以看到Fragment內(nèi)存泄漏的第一個(gè)原因,內(nèi)部類runnable持有了view的實(shí)例,每個(gè)Runnbale會(huì)發(fā)送一個(gè)延時(shí)5秒的消息,消息發(fā)送期間,有可能view、fragment已經(jīng)結(jié)束了生命周期,此時(shí)產(chǎn)生了內(nèi)存泄漏。
解決辦法也很簡(jiǎn)單,view離開窗口的時(shí)候,釋放Handler中消息,釋放Runnbale對(duì)view 的引用。
- 靜態(tài)Runnbale內(nèi)部類+對(duì)view的弱引用(此部分代碼與前面的示例很相似,不重復(fù)貼代碼了)
- 離開窗口remove#handler消息
view對(duì)Activity暴露了pause方法,在Activity銷毀時(shí),強(qiáng)制清空handler的任務(wù);
// view代碼
/*** 停止輪播*/public void pause() {mIsAutoPlay = false;mHandler.removeCallbacks(mLoopRunnable);mBannerPageClickListener = null;}
// Activity代碼:@Overridepublic void onDestroy() {super.onDestroy();dataBing.homeBanner.pause();}