ViewPager默认会去预加载当前页面前后的两个Fragment。
为了防止加载多个Fragment时出现切换卡顿,加载不可见Fragment初始化数据占用太多的资源。采用懒加载,实现预加载的轻量初始化,第一次可见状态才开始记载数据。把Fragment拆为可见和不可见2个生命状态。
主要使用Fragment的两个方法:
1.setUserVisibleHint(boolean isVisibleToUser)
,通过isVisibleToUser
告诉我们当前Fragment是否可见。
2.getUserVisibleHint()
,判断当前Fragment是否可见。
贴代码:
public abstract class BaseLazyFragment extends Fragment {
protected Context mContext = null;
/**
* 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
*/
private boolean isFirstResume = true;
private boolean isFirstVisible = true;
private boolean isFirstInvisible = true;
private boolean isPrepared;
/**
* 设置此变量为true时不使用懒加载
*
* @param prepared
*/
public void setPrepared(boolean prepared) {
isPrepared = prepared;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initPrepare();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Deprecated
@Override
public void onResume() {
super.onResume();
if (isFirstResume) {
isFirstResume = false;
return;
}
if (getUserVisibleHint()) {
onUserVisible();
}
}
@Deprecated
@Override
public void onPause() {
super.onPause();
if (getUserVisibleHint()) {
onUserInvisible();
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (isFirstVisible) {
isFirstVisible = false;
initPrepare();
} else {
onUserVisible();
}
} else {
if (isFirstInvisible) {
isFirstInvisible = false;
onFirstUserInvisible();
} else {
onUserInvisible();
}
}
}
private synchronized void initPrepare() {
if (isPrepared) {
onFirstUserVisible();
} else {
isPrepared = true;
}
}
/**
* 第一次fragment可见(进行初始化工作)
*/
protected void onFirstUserVisible() {
}
/**
* fragment可见(切换回来或者onResume)
*/
private void onUserVisible() {
}
/**
* 第一次fragment不可见(不建议在此处理事件)
*/
private void onFirstUserInvisible() {
}
/**
* fragment不可见(切换掉或者onPause)
*/
private void onUserInvisible() {
}
}
- 请求数据的操作放在
onFirstUserVisible()
方法中去实现,可以有效的避免卡顿.setUserVisibleHint()
在Fragment所有生命周期之前。viewPager.setOffscreenPageLimit(10);
//预加载10个Fragment
这个方法用来设置预加载页面数量,设置0和1是同样的效果,默认不设置数量的情况下预加载下一页。所以懒加载用这个方法无效。
网友评论