最近做一个本地文件管理的功能 因为数据量比较大 使用起来非常卡顿 后来作为菜鸟的我发现Fragment每次都被加载了不止一次 然后研究了好久的Fragment的生命周期还是找不到为什么Fragment的onActivitycreate等进行了两次 后来经过排查才发现是因为使用了ViewPage使得Fragment的生命周期变得没有意义了 Viewpage会将你需要的Fragment周边的Fragment提前预加载 这样的设计遇到大量数据时会严重影响性能 所以对Fragment进行了懒加载
/*
* Author: XUPF
* Date: 2020/4/22 16:06
* Description: 适应ViewPage中使用Fragment处理大量数据的懒加载基类
*/
import android.content.Context;
import android.nfc.Tag;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public abstract class LazyFragment extends BaseFragment{
protected View mRootView;
protected Context mContext;
protected boolean isVisible;
private boolean isPrepared;
private boolean isFirst = true;
//--------------------system method callback------------------------//
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
initPrepare();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()){
isVisible = true;
lazyLoad();
}else{
isVisible = false;
onInvisible();
}
}
@Override
public void onResume() {
super.onResume();
if(getUserVisibleHint()){
setUserVisibleHint(true);
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getActivity();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(mRootView == null){
mRootView = initView(inflater,container,savedInstanceState);
}
return mRootView;
}
//--------------------------------method---------------------------//
/**
* 懒加载
*/
protected void lazyLoad(){
if(!isPrepared || !isVisible || !isFirst){
return;
}
initData();
isFirst = false;
}
//--------------------------abstract method------------------------//
/**
* 在onActivityCreated中调用的方法,可以用来进行初始化操作。
*/
protected abstract void initPrepare();
/**
* fragment被设置为不可见时调用
*/
protected abstract void onInvisible();
/**
* 这里获取数据,刷新界面
*/
protected abstract void initData();
/**
* 初始化布局,请不要把耗时操作放在这个方法里,这个方法用来提供一个
* 基本的布局而非一个完整的布局,以免ViewPager预加载消耗大量的资源。
*/
protected abstract View initView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState);
}
然后继承这个工具类使用就行了
@Override
protected void initData() {
getFiles();
}