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的延迟加载任务取消掉。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Android实现单页显示3个Item的ViewPager炫酷切换效果

    单页显示3个Item的ViewPager炫酷切换效果,适用于Banner等. 效果图 Rotate Y Rotate Down Rotate Up Alpha ScaleIn ScaleIn + Alpha + Rotate Down 使用 ###(1)引入 compile `com.zhy:magic-viewpager:1.0.1` ###(2)示例 布局文件 <FrameLayout android:layout_width="match_parent" android:l

  • Android中TabLayout结合ViewPager实现页面切换

    一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:design:23.4.0' 也可以将support-v4替换为appcompat-v7,例如: compile 'com.android.support:appcompat-v7:23.4.0' 因为appcompat-v7是依赖于support-v4的. 更多说明可参考官方文档

  • anndroid使用ViewPager实现三个fragment切换

    一.ViewPager的基本用法 1.ViewPager概述 ViewPager是android扩展包v4包中的类,这个类可以让我们左右切换当前的view.我们先来聊聊ViewPager的几个相关知识点: ViewPager类直接继承了ViewGroup类,因此它一个容器类,可以添加其他的view类 ViewPager类需要一个PagerAdapter适配器类给它提供数据(这点跟ListView一样需要数据适配器Adater) ViewPager经常和Fragment一起使用,并且官方还提供了专

  • Android App中使用ViewPager+Fragment实现滑动切换效果

    在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

  • Android使用TabLayou+fragment+viewpager实现滑动切换页面效果

    TabLayou 主要实现的是标题头的 滑动 这个 控件 类似于 ScrollView XML中的布局 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <android.support.design.widget.TabLayout a

  • Android ViewPager实现动画切换效果

    概述 ViewPager是Android开发中使用场景非常频繁的控件,单一的动画效果切换已经越来越不能满足追求个性化的应用中.而ViewPager自身也带有一个接口来处理页面间的动画切换,那就是setPageTransformer.下面我们通过代码来学习动画效果的切换. 实现简单动画切换 代码如下: 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&

  • Android基于ViewPager实现类似微信页面切换效果

    此文,仅做为个人学习Android,记录成长以及方便复习! 实现ViewPager实现类似微信的页面切换,此文通过Fragment适配器实现 首先在布局文件activity_main.xml添加ViewPager ViewPager是页面,PagerTabStrip和 PagerTitleStrip是设置标题的 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

  • Android使用ViewPager实现顶部tabbar切换界面

    类似的功能可以看看: 使用RadioGroup实现底部导航栏 进入正题 效果图: 注:PagerSlidingTabStrip为自定义控件,用于切换界面,此处不便贴出代码 1.主界面xml布局中添加ViewPager控件: <android.support.v4.view.ViewPager android:id="@+id/pager_view" android:layout_width="match_parent" android:layout_heigh

  • Android使用自定义PageTransformer实现个性的ViewPager动画切换效果

    1.概述 之前写过一篇博文:Android 自定义 ViewPager 打造千变万化的图片切换效果.有兄弟提出,ViewPager自带了一个setPageTransformer用于设置切换动画~ 本篇博文,将: 1.介绍如何使用setPageTransformer设置切换动画: 2.自定义PageTransformer实现个性的切换动画: 3.该方法在SDK11以下的版本不起作用,我们会对其做一定修改,让其向下兼容. 官方示例地址:http://developer.android.com/tra

  • Android使用ViewPager快速切换Fragment时卡顿的优化方案

    当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即Fragment需要加载UI内容,而又频繁地切换Fragment,就容易产生卡顿现象(类似在ListView快速滑动的同时加载图片容易卡顿). 优化方案: 1.Fragment轻量化 如果ViewPager加载的Fragment都比较轻量,适当精简Fragment的布局,可提高Fragment加载的速度,从而减缓卡顿现象. 2.防止Fragment被销毁 ViewP

  • vue渲染大量数据时卡顿卡死解决方法

    目录 1. 问题描述 2. 常见的解决方案 3. 解决方案流程图 4. 代码 1. 问题描述 由于业务需求,需要在一个页面中点击查询按钮时加载出所有的数据,但数据量有近10万条,渲染出现卡顿,页面卡死. 2. 常见的解决方案 - 自定义中间层 自定义nodejs中间层,获取并拆分这10w条数据, 前端对接nodejs中间层,而不是服务器 缺点:成本高 - 虚拟列表 只渲染可视区域DOM,其他隐藏区域不显示,只用div撑起高度,随着浏览器滚动,创建和销毁DOM. 虚拟列表实现起来非常复杂,可借用第

  • CSS3 动画卡顿性能优化的完美解决方案

    为什么会卡顿? 有一个前提必须要提,前端开发者们都知道,浏览器是单线程运行的.但是我们要明确以下几个概念:单线程,主线程和合成线程. 虽然说浏览器执行js是单线程执行(注意,是执行,并不是说浏览器只有1个线程,而是运行时,runing),但实际上浏览器的2个重要的执行线程,这 2 个线程协同工作来渲染一个网页:主线程和合成线程. 一般情况下,主线程负责:运行 JavaScript:计算 HTML 元素的 CSS 样式:页面的布局:将元素绘制到一个或多个位图中:将这些位图交给合成线程. 相应地,合

  • 详解Android 在 ViewPager 中使用 Fragment 的懒加载

    我们先看一下效果: 首先,我们要知道什么是懒加载: 懒加载,就是先初始化控件,在用户可见的时候再加载数据. 为什么要懒加载? 懒加载多被使用在新闻资讯类客户端中,试想那么多的分类如果一下子都加载出来,真的是极大地消耗了系统资源.可能有人会说 ViewPager 有 viewPager.setOffscreenPageLimit() 的方法,我们传个 0 进去不就好了吗?看过源码的应该知道,即便你传了 0 进去,系统也会默认为 1 的,也就是 ViewPager 依然会加载当前页面的前后各一个 F

  • Android优化方案之Fragment的懒加载实现代码

    一.背景 在Android应用中,ViewPager是我们不可避免使用的一个控件,因为它可以使我们在占用较少空间的同时,增强内容的丰富性,同时以其内部流淌着Google的血液,所以它几乎成了每一个App的标配控件.但是,假如ViewPager的每一个Fragment都需要通过网络拉取数据加载,而ViewPager是默认加载前两项的,所以在很容易造成网络丢包或者网络堵塞等问题,所以Fragment使用懒加载是非常有必要的. 举个栗子: 如上图所示,我们有两个大的Tab:人物和风景.而人物Tab下有

  • Android教你如何发现APP卡顿的实现

    最近部门打算优化下 APP 在低端机上的卡顿情况,既然想优化,就必须获取卡顿情况,那么如何获取卡顿情况就是本文目的. 一般主线程过多的 UI 绘制.大量的 IO 操作或是大量的计算操作占用 CPU,导致 App 界面卡顿.只要我们能在发生卡顿的时候,捕捉到主线程的堆栈信息和系统的资源使用信息,即可准确分析卡顿发生在什么函数,资源占用情况如何.那么问题就是如何有效检测 Android 主线程的卡顿发生? 用 adb 系统工具观察 App 的卡顿数据情况,试图重现场景来定位问题. 常用的方式是使用

  • iOS 无卡顿同时使用圆角、阴影和边框的实现

    在 iOS 开发中,最怕看到设计稿里圆角.阴影和边框同时出现,这三兄弟简直就是性能杀手. 优化的方法百度一下有很多,虽然方法不同但是原理都一样. 分享一个我自己一直使用的方法:在一个 View 里只应用一种效果,然后通过组合的方式达到效果. override init(frame: CGRect) { super.init(frame: frame) imageView = UIImageView(image: UIImage(named: "img")) imageView.laye

  • vue中解决拖拽改变存在iframe的div大小时卡顿问题

    写在最前 针对于在vue中实现拖拽改变两左右个div大小的方式,请查看上一篇文章<vue中实现拖动调整左右两侧div的宽度>.此文章主要针对于实际应用中需要拖拽改变大小的组件中使用iframe框架时存在明显卡顿的问题,比如这样,右侧div中使用了一个iframe组件,导致实际操作中出现两个问题,一个是拖不动,另外一个是无法根据鼠标移动,快速响应,甚至在监听鼠标的按下和松开事件上都有明显的卡顿问题.如果去除右侧iframe框架,则没有问题. 有iframe情况 无iframe情况 问题原因&am

  • Android之Viewpager+Fragment实现懒加载示例

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用.而ViewPager默认会缓存三页数据,即:Viewpager每加载一个Fragment,都会预先加载此Fragment左侧或右侧的Fragment.而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源,浪费用户流量不止,还造成卡顿,这样的结果,我们当然不会满意.那么,能不能做到当切换到这个fr

  • Android基于ViewPager Fragment实现选项卡

    先给大家展示效果图: 1.新建TestFragmen继承Fragment public class TestFragment extends Fragment { private static final String TAG = "TestFragment"; private String hello;// = "hello android"; private String defaultHello = "default value"; pri

随机推荐