fragment 懒加载,新闻内容页类的多个fragment的优化
1.目标
1.fragment切换时只加载当前fragment不预加载前后的fragment
2.从当前fragment切出去时及时回收,节省内存
2.方案
1.setUserVisibleHint(boolean isVisibleToUser)
该方法获取当前fragment是否对用户可见:
true:如果可见获取数据
false:如果不可见,释放内存
**但是要注意**:
1.当fragment切出去时,isVisibleToUser=false
会被调用两次。
2.isVisibleToUser=true,在oncreate之前,
也就是view并未初始化
**结论**:
1.也就是说我们只要在isVisibleToUser=true&&view初始化之后
获取数据就可以实现懒加载
**但是有坑**:
1.view初始化后的操作不要放到onViewCreated()里
因为并不一定会被调用,这个方法不是fragment生命周期里的,
到是onActivityCreated是一定会被调用的
2.getUserVisibleHint()方法获取到的结果竟然经常时不正确的
明明显示了却返回false,
所以自己定义一个成员变量同步setUserVisibleHint的参数就好
原因需要在查
3.代码
private boolean isInit = false;
private boolean isVisible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//在fragment可见时在加载数据,以防viewpager与加载fragment造成卡顿,
//但第一个fragment不会进入判断所以单独处理
isVisible = isVisibleToUser;
if (!isVisibleToUser){
listData.clear();
}
//并没有被销毁时会走这里获取数据
isCanLoadData();
}
@Override
public void onActivityCreated(@android.support.annotation.Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isInit = true;
isCanLoadData();
}
public void onDestroyView() {
super.onDestroyView();
isInit = false;
}
private void isCanLoadData(){
if (isInit&& isVisible &&listData.isEmpty()){
//自己加载数据的地方
}
}
4.后记
这篇笔记只解决了懒加载的问题,没有解决控制viewpager加载几个fragment的问题慢慢研究以待后续