- Fragment懒加载的使用场景便是在一个ViewPager管理多个Fragment时候,由于ViewPager”出色”的缓存机制会在显示一个Fragment的同时,预先加载好左右相邻两个Fragment的部分资源(会触发相邻Fragment的onCreate生命周期)。所谓的懒加载就是让我们加载数据的操作仅在Fragment可见的时候执行,可以节省不必要的开销。
- 看”懒加载”这个名称挺唬人的,其实就是通过系统提供的setUserVisibleHint(boolean isVisibleToUser)方法,在这其中进行数据的加载。
- setUserVisibleHint:
Set a hint to the system about whether this fragment’s UI is currently visible to the user.
An app may set this to false to indicate that the fragment’s UI is scrolled out of visibility
or is otherwise not directly visible to the user.
This may be used by the system to prioritize operations such as fragment lifecycle updates
or loader ordering behavior.
/**
* 懒加载Fragment
*/
public abstract class BasePageFragment extends BaseFragment {
protected boolean isViewInitiated;
protected boolean isVisibleToUser;
protected boolean isDataInitiated;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareFetchData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
}
public abstract void fetchData();
public boolean prepareFetchData() {
return prepareFetchData(false);
}
public boolean prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
isDataInitiated = true;
return true;
}
return false;
}
}