android Viewpager取消预加载

1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载。通过设置setOffscreenPageLimit(int number) 来设置预加载的数量,在V4包中,默认的预加载是1,即使你设置为0,也是不起作用的,设置的只能是大于1才会有效果的。

2.限制预加载,会出现滑动过程中卡顿现象。其实Fragment中防止预加载主要是防止数据的预加载,Fragment中的VIew预加载是有好处的,我们可以通过Fragment中的一个方法来达到预加载View 但是不加载数据,在Fragment显示的时候才去加载数据。

<span style="white-space:pre">		</span>@Override
	    public void setUserVisibleHint(boolean isVisibleToUser) {
                        //判断Fragment中的ListView时候存在,判断该Fragment时候已经正在前台显示  通过这两个判断,就可以知道什么时候去加载数据了
			if (isVisibleToUser && isVisible() && mPullToRefreshGridView.getVisibility() != View.VISIBLE) {
	            initData(); //加载数据的方法
	        }
	        super.setUserVisibleHint(isVisibleToUser);
	    }


这个方法会在切换到Fragment显示的时候去调用。
为了保证一开始加载Fragment的时候该方法提前调用,导致的数据不会加载,我在代码中做出了如下的判断:
<span style="white-space:pre">		</span>@Override
		public void onActivityCreated(Bundle savedInstanceState) {
			if (getUserVisibleHint() && mPullToRefreshGridView.getVisibility() != View.VISIBLE) {
				initData();
			}
			super.onActivityCreated(savedInstanceState);
		}

特别注意:
1.在刚开始加载Fragment的时候,setUserVisibleHint这个方法比onCreated方法执行的还要早。预加载的Fragment就不会执行这个方法。
2.在VIewPager 切换到某个Fragment的时候,还会调用该方法。

通过在这个方法中去加载数据,我发现可以一定程度的实现预加载问题,保证了预加载不会加载数据,只会加载Fragment中的VIew,这样就可以保证了VIewPager滑动的流畅性,也保证了只有切换到一个Fragment的时候才去加载数据的目的。
-------------------------------------------------------------------切割线------------------------------------------------------------------------------

处理方案

1.Fragment轻量化

如果ViewPager加载的Fragment都比较轻量,适当精简Fragment的布局,可提高Fragment加载的速度,从而减缓卡顿现象。


2.防止Fragment被销毁

ViewPager在切换的时候,如果频繁销毁和加载Fragment,就容易产生卡顿现象,阻止Fragment的销毁可有效减缓卡顿现象。

 

(1)    在PagerAdapter里覆盖destroyItem方法可阻止销毁Fragment

@Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            //super.destroyItem(container, position, object);
        }


(2)    通过PagerAdapter的setOffscreenPageLimit()方法可以设置保留几个Fragment,适当增大参数可防止Fragment频繁地被销毁和创建。

风险:在Fragment比较多的情况下,部分低端机型容易产生OOM问题。


3.Fragment内容延迟加载

(1) 描述

在切换到当前Fragment的时候,并不立刻去加载Fragment的内容,而是先加载一个简单的空布局,然后启动一个延时任务,延时时长为T,当用户在该Fragment停留时间超过T时,继续执行加载任务;而当用户切换到其他Fragment,停留时间低于T,则取消该延时任务。


(2) 具体操作

首先,设置延迟任务

 private Runnable LOAD_DATA = new Runnable() {
        @Override
        public void run() {

            //在这里讲数据内容加载到Fragment上
        }
    };

启动任务

<pre name="code" class="java"> @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
    //初始化视图,这里最好先设置一个进度对话框,提示用户正在加载数据
    initView();
    //启动任务,这里设置500毫秒后开始加载数据
    handler.postDelayed(LOAD_DATA,500);
    
    return view;
}



 

若用户切换到其他Fragment则取消任务

//判断Fragment是否可视的重载方法
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

       if(!isVisibleToUser)
                mHandler.removeCallbacks(LOAD_DATA);
 }

(3) 注意

使用setUserVisibleHint判断用户是否切换到其他Fragment,这样的做法有个缺陷,因为会在ViewPager开始滑动的时候取消延时任务,而在滑动偏移量不足的情况下,ViewPager会继续回滚到当前Fragment,导致当前Fragment的加载任务被取消而又不会重新启动加载任务。

  这里我使用的做法是,给ViewPager增加一个OnPageChangeListener,,该监听器的onPageSelected(position)能监听ViewPager当前切换到哪个Fragment,在这里将其他Fragment的延迟加载任务取消掉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值