Fragment 实现懒加载
2019-07-24 本文已影响0人
八分半
一、懒加载的目的
在ViewPager
嵌套Fragment
中,ViewPager
会自动实现预加载,在 Fragment
创建过程中都会执行默认网络请求,无论Fragment
是否对用户可见,显然有些浪费流量、影响性 App 性能、用户体验不佳等缺点。为解决上述问题,需实现Fragment
仅在用户可见的状态下加载网络数据。
二、懒加载实现方案
Fragment
有一个非生命周期的setUserVisibleHint(boolean isVisibleToUser)
回调方法,当 ViewPager
嵌套 Fragment
时会起作用,如果切换 ViewPager
则该方法也会被调用,参数isVisibleToUser
为true
代表当前 Fragment
对用户可见,否则不可见。
setUserVisibleHint(boolean isVisibleToUser)
在Fragment
创建之初会回调一次isVisibleToUser
的值为false
,在Fragment创建之后用户可见时再回调一次,此时isVisibleToUser
的值为true
。
根据setUserVisibleHint(boolean isVisibleToUser)
这个回调方法的特性,我们可以实现Fragment
的懒加载。
1.在BaseFragment
中添加变量
private boolean isViewCreated; // 界面是否已创建完成
private boolean isVisibleToUser; // 是否对用户可见
private boolean isDataLoaded = false; // 数据是否已请求
2.重载setUserVisibleHint(boolean isVisibleToUser)
回调方法,创建lazyLoad()
方法,在Fragment
创建之后、用户可见、第一次加载时调用lazyLoadDate()
方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
lazyLoad();
}
private void lazyLoad(){
if(isViewCreated && isVisibleToUser && !isDataLoaded){
isDataLoaded = true;
lazyLoadDate();
}
}
/**
* 懒加载
* 在此加载网络数据
*/
public void lazyLoadDate(){
}
3.重载onActivityCreated
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewCreated = true;
lazyLoad();
}
三、使用方法
继承BaseFragment
,并且重载lazyLoadDate()
,在lazyLoadDate()
加载网络数据即可。