预期效果:用户不可见界面只初始化UI,UI可见时开始获取数据并更新UI。
预加载
ViewPager默认会缓存当前页相邻的界面,比如当滑动到第2页时,会初始化第1页和第3页的界面(即Fragment对象,且生命周期函数运行到onResume()),可以通过setOffscreenPageLimit(count)设置离线缓存的界面个数。
懒加载
ViewPager+Fragment中,滑动到新的Fragment,先显示”正在加载”,过会才会正常显示界面
为什么懒加载:用户没进入的界面需要有一系列的网络、数据库等耗资源、耗时的操作,预先做这些数据加载是不必要的。
屏蔽未显示UI初始化数据:
UI可见时请求数据
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fra_1extends Fragment {
private ViewmRootView;
private boolean mIsInited;
private boolean mIsPrepared;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.activity_main, container,false);
mIsPrepared =true;
lazyLoad();
return mRootView;}
public void lazyLoad() {
if (getUserVisibleHint() &&mIsPrepared && !mIsInited) {
//异步初始化,在初始化后显示正常UI
loadData();}}
private void loadData() {
new Thread() {
public void run() {
//1. 加载数据
//2. 更新UI
//3. mIsInited = true
}
}.start();}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
lazyLoad();}}
public static Fra_1 newInstance() {
return new Fra_1();}}
Tips:为避免不必要的重新数据加载(重复调用onCreateView()),设置Viewpager默认缓存半径为Fragment数-1;既4个Fragment设置setOffscreenPageLimit(3);
转至:https://mp.weixin.qq.com/s/dUuGSVhWinAnN9uMiBaXgw