ViewPager的预加载
在项目中,经常会遇到ViewPager+TabLayout实现对多个fragment的管理。但是由于ViewPager的预加载(默认的预加载为1),viewpager会调用fragment的onCreateView()进行fragmemt的初始化:
而在Android中当fragment的onCreateView()会将整个xml文件中的UI控件实例到内存,而且数据的请求初始化基本也是在onCreateView()中进行。导致App启动的时候加载的数据过多。
解决方案
解决这个问题有两种方式,一种是禁止ViewPager的预加载,重写ViewPager,但是该方法会出现左右滑动时会出现卡顿现象,带来不好的用户体验。而另外一种就是我们接下来要讲的通过Fragment的懒加载来实现。当用户切换到某个fragment时再加载。
setUserVisibleHint()方法
懒加载主要使用到fragment中的setUserVisibleHint(),这个方法是当fragment的UI显示状态变化时会被调用。源码如下:
实现
- 因为fragment的onCreateView()方法会将xml中的控件加载到内存中,所以我们定义一个空的FragmentLayout。
创建一个空的容器作为预加载界面
并在onCreateView()中初始化这个布局
|
|
- 将具体的内容的UI定义到一个子xml中,并在setUserVisibleHint()方法中进行初始化控件和数据加载,并将这个xml放入外部的容器中。
重新创建一个子布局
并在setUserVisibleHint()中进行初始化
注意
ViewPager在预加载fragment的时候是先调用setUserVisibleHint(), 然后再是调用onCreateView()方法。