Fragment懒加载看见这个标题的时候不少人都会问为何Fragment要懒加载,或者在哪一种场景须要懒加载?html
带着这两个疑问咱们开始往下看。java
一、为何Fragment要懒加载android
这个缘由有点简单,就是想在用户可见的状况下Fragment才进行一系列的逻辑操做,这样减小了手机的内存开销。网络
二、那种场景须要Fragment要懒加载app
这个能够说本文中的重点了,就是ViewPager+Fragment联合使用的时候。有时候在ViewPager的第一页有不少网络请求,第二页也仍是有不少网络请求。而ViewPager默认状况(自定义ViewPager不在我说的范围内)是进行预加载一页的,意思就是ViewPager的第一页和第二页的网络请求都是同时发起的,这种状况下咱们手机的内存消耗也多,而网络很差的时候用户体验也不要,因而就想到了Fragment懒加载。ide
上代码(其实很简单的):布局
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class BaseFragment extends Fragment implements View.OnClickListener {
protected View mContentView;
/**
* 控件是否初始化完成
*/
private boolean isViewCreated;
/**
* 数据是否已加载完毕
*/
private boolean isLoadDataCompleted;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
this.mContentView = inflater.inflate(loadLayoutId(), null);
initViews();
bindListener();
isViewCreated = true;
return mContentView;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isViewCreated)//只有在用户可见以及初始化以后才加载数据
lazyLoad();
}
/**
* Framgnet重组时候也会跳过onCreate,而onAttach和onActivityCreated仍是会被调用
*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getUserVisibleHint())
lazyLoad();
}
/**
* 懒加载的方法
*/
protected void lazyLoad() {
if (!isLoadDataCompleted) {
initData();
processLogic();
isLoadDataCompleted = true;
}
}
/**
* 为Fragment加载布局
*/
protected abstract int loadLayoutId();
/**
* 初始化控件
*/
protected abstract void initViews();
/**
* 初始化数
*/
protected abstract void initData();
/**
* 为控件设置监
*/
protected void bindListener() {
}
/**
* 逻辑操做,网络请求
*/
protected void processLogic() {
}
protected T $(@IdRes int viewId) {
return (T) mContentView.findViewById(viewId);
}
protected void bindClickListener(View... views) {
for (View view : views) {
if (view != null)
view.setOnClickListener(this);
}
}
/**
* 控件点击回调
*/
protected void onClick(View view, int id) {
}
@Override
public void onClick(View v) {
onClick(v, v.getId());
}
@Override
public void onDestroyView() {
isLoadDataCompleted = false;//这里须要重置状态,否则加载了以后就没办法再从新加载了
super.onDestroyView();
}
}
看到这里,Fragment懒加载也基本结束了,可能我阐述得不是很清楚,你们能够看看其余大神们的博客什么的。this
ViewPager+Fragment取消预加载(延迟加载).net
Fragment要懒加载