Android ViewPager Fragment的懒加载和防止Fragment销毁重复加载

一.ViewPager+Fragment防止Fragment重复加载

1.当Fragment比较多的时候如果有20个Fragment都不销毁的话就很浪费资源,这种情况下我们最好用setOffscreenPageLimit(2),相当于同事允许五个Fragment存在不销毁。如果每个Fragment消耗内存不多时可以这样处理。
2.当Fragment比较少的时候并且每个Fragment消耗的内存不多,这种情况可以直接注释适配器中destroyItem方法里的//super.destroyItem(container, position, object)即可;

二.Fragment懒加载

在fragment的setUserVisibleHint(用户是否可见)方法里实现【注意此方法一定要在onViewCreated()(View加载完毕)方法执行后才能执行懒加载】
懒加载的主要思路是当fragment初始化完成后且当fragment在前台用户能看见时初始化数据(一般是请求网络)
注意:懒加载完成后和界面销毁后要重新归零懒加载状态防止重复加载
懒加载代码如下:
public abstract class BaseFragment extends Fragment {

private String mTextviewContent;
private MainActivity mMainActivity;

//Fragment的View加载完毕的标记
private boolean isViewCreated;
//Fragment对用户可见的标记
private boolean isUIVisible;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_item, container, false);
    initView(view);
    return view;
}

private void initView(View view) {
    TextView textView = (TextView) view.findViewById(R.id.textview);
    mTextviewContent = getFragmentTextviewContent();
    textView.setText(mTextviewContent);

    mMainActivity = (MainActivity) getActivity();
    printLog(mTextviewContent + "加载了");
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    isViewCreated = true;
    lazyLoad();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    //isVisibleToUser这个boolean值表示:该Fragment的UI 用户是否可见
    if (isVisibleToUser) {
        isUIVisible = true;
        lazyLoad();
    } else {
        isUIVisible = false;
    }
}

private void lazyLoad() {
    //这里进行双重标记判断,是因为setUserVisibleHint会多次回调,并且会在onCreateView执行前回调,必须确保onCreateView加载完毕且页面可见,才加载数据
    if (isViewCreated && isUIVisible) {
        loadData();
        //数据加载完毕,恢复标记,防止重复加载
        isViewCreated = false;
        isUIVisible = false;

        printLog(mTextviewContent + "可见,加载数据");
    }
}


protected abstract void loadData();


@Override
public void onDestroyView() {
    super.onDestroyView();
    //页面销毁,恢复标记
    isViewCreated = false;
    isUIVisible = false;
    printLog(mTextviewContent + "销毁了");
}

private void printLog(String logStr) {
    TextView logView = new TextView(getContext());
    logView.setText(logStr);
    mMainActivity.addLog(logView);
}

/**
 * Fragment中TextView显示的内容
 */
protected abstract String getFragmentTextviewContent();

}

你可能感兴趣的:(Android ViewPager Fragment的懒加载和防止Fragment销毁重复加载)