首先是检测内存泄露的最大利器:Leakcanary
依赖和接入很是简单:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.3'
在自己application里面
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
然后就可以开始了... 先看看问题:
一共两种泄露直接看图
第一张图咱们明显看出来是ViewPager的问题,而且只看到MainActivity里的mViewPager别的都看不到
第二种可以看见是MainActivity里的MFragments的问题,然后就找到TestFragment了
我首先想到就是fragment里有什么东西给泄露了?然后看了看代码
明显没什么问题呀,那只能是mFragments的问题了呗
但是我在测试修改
mViewPager.setOffscreenPageLimit(1);
为
mViewPager.setOffscreenPageLimit(4);
就不会出现问题了,跟1和4有关系的只能是ViewPager里的fragment回收的问题了
会不会跟adapter有关系?看了看代码貌似没啥问题呀:
然后百度google了一通发现一篇文章
viewpager + fragment+FragmentStatePagerAdapter中用List存放多个Fragment 造成的内存泄漏
see了一see 貌似问题就是出现在adapter 然后按照人家说法改一下试一试
github传送门:ViewPagerDemo
另外还有fragment懒加载+mvp+okhttp+retrofit的demo:NetRequestDemo