项目中出现了问题,查找原因是ViewPager.setOffscreenPageLimit()设置的预加载数量导致的,刚好记录一下。
1.setOffscreenPageLimit() 方法设置的默认值是1.这个设置的值有两层含义: 一是 ViewPager 会预加载几页; 二是 ViewPager 会缓存 2*n+1 页(n为设置的值)。如设置为n=1,当前在第一页,会预加载第二页,滑倒第二页,会预加载第三页,当滑倒第三页,第一页会销毁,第四页会加载。
所以ViewPager 中Fragment的生命周期了:setOffscreenPageLimit 的值影响的是 onViewDestory 方法.当缓存的 fragment 超过 setOffscreenPageLimit 设置的值后, 那些 fragment 的onViewDestory 方法会回调;
当然不想切换的时候去重新创建Fragment,可以将适配器FragmentPagerAdapter的方法重写就好了。
2.关于懒加载的实现。
因为setOffscreenPageLimit方法的默认值为1,所以Viewpage至少会预加载一页,预加载是有好处的,但是也有缺点,比如当前页面有网络请求之类的,预加载的页面也有,就会导致许多任务在等待,影响当前页面的数据请求。所以应该可见的时候去请求数据,本来想设置这个方法setOffscreenPageLimit的值为0 ,以为可以解决,但是查看了源码看到当设置为0或者负数的时候,都会返回的1,所以无效:
Fragment 里面有个方法 setUserVisibleHint(boolean isVisibleToUser) 方法. 这个方法可以判断当前页面是否对用户可见.
在这个方法里面具体去处理数据的加载就可以了。