ViewPager+Fragment的预加载问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leo_eight/article/details/51031346

把Fragment装进ViewPager, 当启动ViewPager所在的Activity时, 默认会预加载两个Fragment. 例如, ViewPager显示的第一个Fragment是Fragment1, 会自动加载下一个的Fragment.

我把四个Fragment装进ViewPager, 并监听四个Fragment的生命周期, 如下图:


从上图可以看到, Fragment2预加载了.


接下来, 向右滑动一下:


同样, Fragment3也预加载了. 再滑到第三个Fragment试试:


咦? Fragment1走完生命周期了!! 可以得出结论:


ViewPager默认会预加载滑动方向的下一个Fragment, 并最多同时加载3个Fragment, 即相邻的左右两个Fragment都加载了.


为了证明这个结论, 再滑到第四个Fragment试试, 如果结论正确, Fragment2会走完生命周期:


果然和我们预想的一样!




但有时我们想同时加载多个Fragment, 怎么办? 只需要简单的一行代码: 


<span style="font-size:14px;color:#009900;"><strong>ViewPager.setOffscreenPageLimit(int limit)</strong></span>


参数limit就代表着同时加载的Fragment数.



那么, 但有时又不想同时加载多个Fragment, 如果加载任务比较重量级, 会导致卡顿, 影响用户体验, 该怎么办? 此时就需要用到下面两个方法来延时加载Fragment:


<span style="font-size:14px;color:#009900;"><strong>boolean Fragment.getUserVisibleHint()          // 当Fragment可见时, 返回true, 否则返回false</strong></span>

<span style="font-size:14px;color:#009900;"><strong>void Fragment.setUserVisibleHint(boolean isVisibleToUser)         // 设置Fragment的可见状态</strong></span>


只用写一个类继承Fragment, 实现当该Fragment可见时, 才进行加载任务: 


<span style="font-size:14px;color:#009900;"><strong>/**
 * 延时加载Fragment
 */
public abstract class BaseFragment extends Fragment{
	
	protected boolean isVisible;
	
	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		
		if(getUserVisibleHint()) {            // 如果可见
			isVisible = true;
			onVisible();
		}else {
			isVisible = false;
			onInvisible();
		}
	}

	private void onInvisible() {
		
	}

	private void onVisible() {
		lazyLoad();
	}
	
	/**
	 * 具体的延时加载任务交给子类具体实现
	 */
	protected abstract void lazyLoad();
}</strong></span>


我们让Fragment3继承该类, 并在lazyLoad方法打印一些信息试试结果:

<span style="font-size:14px;color:#009900;"><strong>@Override
protected void lazyLoad() {
	// dosomething
	Log.i(TAG, "****lazyLoad");
}</strong></span>


我滑到Fragment2时, lazyLoad没有执行


再滑到Fragment3, 看看输出:


结果很明了了!!  延时加载实现了!


猜你喜欢

转载自blog.csdn.net/Leo_eight/article/details/51031346