ViewPager -- Fragment 切换卡顿 性能优化
来源:互联网 发布:parseint javascript 编辑:程序博客网 时间:2024/05/17 04:24
当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的延迟加载任务取消掉。
================项目中用到的代码片段==========================================================
Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { getActivity().runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub geticard(); } }); } }, 500);
- ViewPager -- Fragment 切换卡顿 性能优化
- ViewPager 快速切换卡顿 --性能优化
- viewpager、fragment滑动切换卡顿问题
- baseadapter getview 重复刷新 ViewPager -- Fragment 切换卡顿 LazyLoad
- ViewPager+Fragment 优化左右侧滑时的卡顿
- 在navigationView中切换Activity Fragment 卡顿优化
- ViewPager卡顿优化实战
- tab切换fragment时,会出现滑动viewpager卡顿迟缓问题
- viewpager+fragment+slidingmenu滑动卡顿解决方法
- 解决ViewPager+Fragment启动页面卡顿
- SlidingMenu切换fragment卡顿问题
- SlidingMenu切换fragment卡顿问题
- Fragment切换再现覆盖卡顿
- android 解决fragment+viewpager+fragment滑动卡顿的问题
- 在navigationView中切换/创建fragment时的卡顿优化
- ViewPager切换动画及性能优化
- 把ViewPager 切换时出现卡顿的问题
- Viewpager结合RadioGroup切换的卡顿,不流畅问题
- iOS pop到前一个页面时键盘闪一下的问题
- servlet获取httpPost请求中的JSON数据
- 已知圆心,半径,角度,求圆上的点坐标
- [iOS]arc4random_uniform()函数
- Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny
- ViewPager -- Fragment 切换卡顿 性能优化
- 三方依赖库在Cocoapods上的制作流程2015年版
- Codeforces Round #335 (Div. 1) A. Sorting Railway Cars
- 批处理(.bat)学习笔记
- Android蓝牙打印机例子
- Spark 提交任务时,报: Invalid signature file digest for Manifest main attributes
- 几行代码实现tab+fragment+viewpager---还有酷炫的动画效果哦
- CMS用通用图片轮换flash幻灯片播放器:Bcastr3和Bcastr4
- python数据分析之kDD(二)