ViewPager -- Fragment 切换卡顿 性能优化

简介: 当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即Fragment需要加载UI内容,而又频繁地切换Fragment,就容易产生卡顿现象(类似在ListView快速滑动的同时加载图片容易卡顿)。

当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);

 

目录
相关文章
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
259 3
|
搜索推荐 物联网 Linux
鸿蒙OS Next与安卓系统的比较
【6月更文挑战第2天】鸿蒙OS Next与安卓系统的比较
1792 3
|
Android开发
Android自定义一个属于自己的刻度尺
Android自定义一个属于自己的刻度尺
213 0
|
Java 测试技术 API
Android透明状态栏和导航栏方案最终版
Android透明状态栏和导航栏方案最终版
1329 0
|
XML 缓存 Java
Android 启动优化(六)- 深入理解布局优化
Android 启动优化(六)- 深入理解布局优化
|
缓存 前端开发 Java
卡顿监测 · 方案篇 · Android卡顿监测指导原则
卡顿监测 · 方案篇 · Android卡顿监测指导原则
831 0
卡顿监测 · 方案篇 · Android卡顿监测指导原则
|
机器学习/深度学习 人工智能 计算机视觉
华南理工TANGO项目原作解读: 文本驱动的三维物体风格化模型
华南理工TANGO项目原作解读: 文本驱动的三维物体风格化模型
321 0
|
Java Android开发
Android汉字转拼音HanziToPinyin
Android系统本身自带有有将汉字转化为英文拼音的类和方法。具体的类就是HanziToPinyin.java。Android系统自身实现的通讯录中就使用了HanziToPinyin.java对中文通讯录做分组整理。
1452 0
|
XML 数据格式 Android开发
BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等
BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等
1445 0
BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等
|
Android开发 开发者 Kotlin
安卓UI设计开发——Material Design(BottomSheetDialogFragment篇)
随着工作的不断深入,作者最近接触到了给APP换UI的需求,看着花里胡哨的新UI,想起了我之前无意在某设计网站上碰到的新词——高级设计感,紧接着,作者又在开发中发现了Google提出的Material Design
603 0