美文网首页
Fragment(androidx.fragment)懒加载

Fragment(androidx.fragment)懒加载

作者: 云烟渐成雨 | 来源:发表于2019-07-27 15:09 被阅读0次

1.原因

在开发过程中我们会遇到Viewpager嵌套Fragment的情况,这时如果每个Fragment中都含有耗时操作(如网络请求等),由于Viewpager有预加载功能,此时无论Fragment是否可见,都已被创建。这样会造成用户的流量消耗、耗时等。

2.setUserVisibleHint()方法被移除

一般的做法是结合Fragment 有一个非生命周期的

setUserVisibleHint(boolean isVisibleToUser)

回调方法来完成懒加载功能,但是在

androidx.fragment.app.FragmentPagerAdapter

中此方法被移除了。下面是开发者文档中提到的


image

3.生命周期

  • 1)创建Fragment
onAttach() —> onCreate() —> onCreateView() —> onActivityCreated() —> onStart() —> onResume()
  • 2)从桌面回到Fragment / 解锁
onStart() —> onResume()
  • 3)切换回本身的Fragment
onCreateView() —> onActivityCreated() —> onStart() —> onResume()

所以我们可以在OnResume中来判断此Fragment是否对用户可见来完成懒加载

public abstract class BaseFragment<V extends ViewDataBinding> extends Fragment{
    protected V binding;
    private View mView;
    private boolean isViewCreated; // 界面是否已创建完成
    private boolean isVisibleToUser; // 是否对用户可见
    private boolean isDataLoaded; // 数据是否已请求, isNeedReload()返回false的时起作用

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        //避免重复创建View
        if (mView == null){
            binding = DataBindingUtil.inflate(inflater, initContentView(inflater, container, savedInstanceState), container, false);
            mView = binding.getRoot();
            isViewCreated = true;
            tryLoadData();
        }else {
            ViewGroup parent = (ViewGroup) mView.getParent();
            if (parent != null){
                parent.removeView(mView);
            }
        }

        return mView;
    }

    public abstract void initData();

    public abstract int initContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);

    /**
     * fragment再次可见时,是否重新请求数据,默认为flase则只请求一次数据
     *
     * @return
     */
    protected boolean isNeedReload() {
        return false;
    }

    @Override
    public void onResume() {
        super.onResume();
        isVisibleToUser = true;
        tryLoadData();
    }

    private void tryLoadData() {
        if (isViewCreated && isVisibleToUser && !isDataLoaded) {
            initData();
            isDataLoaded = true;
        }
    }

}

相关文章

网友评论

      本文标题:Fragment(androidx.fragment)懒加载

      本文链接:https://www.haomeiwen.com/subject/molerctx.html