Android使用ViewPager快速切换Fragment时卡顿的优化方案
当viewpager切换到当前的fragment时,fragment会加载布局并显示内容,如果用户这时快速切换viewpager,即fragment需要加载ui内容,而又频繁地切换fragment,就容易产生卡顿现象(类似在listview快速滑动的同时加载图片容易卡顿)。
优化方案:
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上 } };
启动任务
@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的延迟加载任务取消掉。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
上一篇: Js文字背景行如流水特效
下一篇: Android实现文字上下滚动效果