一.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();
}