Fragment 懒加载
什么时候需要懒加载?
这个情况一般存在于ViewPage
中使用使用FragmentPagerAdapter
,使用ViewPage加载大量的Fragment
,由于ViewPage
会预先加载Fragment导致没有显示的Fragment
会在后台预先加载,造成流量浪费。
原理
主要靠的是Fragment
的void setUserVisibleHint(boolean isVisibleToUser)
方法
ViewPage
在设置当前视图是会调用 adapter.setPrimaryItem(ViewGroup container, int position, Object object)
的方法,FragmentPagerAdapter
中调用Fragment
的setUserVisibleHint
方法
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
注意事项
setUserVisibleHint
方法,在onCreateView
之前调用
如果在setUserVisibleHint
,操作View
(显示Loading)可能会出现空指针,因为还没有创建View所以要考虑在onCreateView之后
实现
设置标记位,重写Fragment
的setUserVisibleHint
public abstract class LazyFragment extends BaseFragment {
protected boolean isViewCreated = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint() && isViewCreated) {
//当前可见
onVisible();
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
}
/**
* fragment 在当前窗口显示
* 可以执行数据加载
*/
protected abstract void onVisible();
}
可以再 github 上看看代码,可以看下具体的生命周期