提高 Activity 跳转速度

提高 Activity 跳转速度从一个页面跳转到另外一个页面,这在Android中是很常见的操作;有的页面跳转是瞬间打开,有的是会微微钝一下才打开;或者在页面里弹出一个Dialog弹框,明明已经调用完了show()方法,但弹框没马上弹出来,延迟了一百多毫秒才显示出来,这样给人的体验就很不好了。为什么会出现这种情况呢?页面跳转迟钝和弹框的展示延迟的原因都一样,基本分为两大类。第一类就是看看是否在UI线程左耗时操作,这个经常是数据方面的问题,比如说要从数据库里面查询数据,或者说对数据做了一些复杂逻辑的操作,例如要对集合中的数据,

大家好,又见面了,我是你们的朋友全栈君。

从一个页面跳转到另外一个页面,这在 Android 中是很常见的操作;有的页面跳转是瞬间打开,有的是会微微钝一下才打开;或者在页面里弹出一个 Dialog 弹框,明明已经调用完了 show()方法,但弹框没马上弹出来,延迟了一百多毫秒才显示出来,这样给人的体验就很不好了。为什么会出现这种情况呢?页面跳转迟钝和弹框的展示延迟的原因都一样,基本分为两大类。

第一类就是看看是否在UI线程左耗时操作,这个经常是数据方面的问题,比如说要从数据库里面查询数据,或者说对数据做了一些复杂逻辑的操作,例如要对集合中的数据,根据bean的某些属性做一些排序、合并等的操作,由或者需要三方sdk提供数据,结果他们提供数据的方法耗时了等等。针对上述情况,我们可以开启一个子线程,来处理这些数据,数据处理工作完成后,再通过 Handler 来接收数据并刷新UI界面,这样就不至于因为数据的原因而导致UI的卡顿了。

上述耗时操作如果是在 onCreate() 或 onResume() 中,必然会导致 Activity 的跳转速度降低。ActivityThread 中已经描述了 Activity 的生命周期,通过它我们知道 UI 是在 Activity的 onResume() 之后才会绘制及显示出来,那么问题就来了,如果在 onCreate() 或 onResume() 中耗时较多,那么 Activity 的跳转速度肯定就慢了;同理,如果弹框的构造方法或 onCreate() 也耗时较多,那么弹框的展示速度也会被拖慢。

第二类就是布局,简单的xml布局,很快就能被转换为UI,但复杂的布局,比如层级比较深的,项目中就会有七八层深的布局,一个页面的 view 加起来有50个,从 Xml 中获取view的节点并转为 FrameLayout、ImageView、TextView 等,是通过反射创建的,本身效率就比较低,再加上 findViewById() ,也可以想象到效率。所以针对这一点,我们可以使用 merge 、ViewStub 等,说白了,就是减少层次,延迟加载等。下面就着重说一下。

从减轻层级方法,对于复杂的布局,可以使用约束布局,这个布局很好用,是相对布局的加强版;有些布局可以通过自定义控件来合并,常见的一个线性布局里面有个文本和图片,我们可以通过自定义view来绘制这些,减轻层级;可以直接代码中创建view,但这种不直观,不推荐。

至于延迟加载,这个可操作的空间比较大,系统封装的 ViewStub 就派上了用场。我们可以把同一业务的合并到同一个里面,这样就可以把复杂的xml布局分割成几小块,我们在根布局中可以只保留一个 LinearLayout ,其他的用 ViewStub,这样就相当于 xml 中只有这么一个控件,初始化起来速度就相当可观了。在 Activity 中,我们可以使用

        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                initView();
            }
        });

这个 Runnable 中的 run() 方法,会在布局初始化完毕后,马上执行,这样就可以在 initView() 中执行 ViewStub 的逻辑了。这样做会导致UI山一下,毕竟这相当于是往空白的容器里添加控件,为了提高体验,可以在跟节点 LinearLayout 中添加一个蒙版View,等 ViewStub 中代码执行完毕后,再把这个蒙版给remove掉,这样就没那么突兀了。

在一些app中也看到过蒙版,主要作用就是上面描述的,其次是为了UI美观。以前一个项目中,产品童鞋看这个蒙版比较好看,直接让我们抄过来,至于它背后的产品逻辑,蒙版的作用及出现的动机,完全不管,抄东西也就只能抄个外形,抓不到精髓。深层次的东西,往往是被重重隐藏的,不会轻易被其他公司的人给抄去。
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143447.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例

    [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例前文作者带领大家学习了什么是逆向分析、逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷。这篇文章将继续普及逆向分析知识,告诉大家如何学好逆向分析,并结合作者经验给出逆向分析的路线推荐,最后给出吕布传游戏逆向案例。话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行。基础性文章,希望对您有所帮助~

    2022年6月19日
    31
  • 前端使用Vue框架解决跨域问题「建议收藏」

    前端使用Vue框架解决跨域问题「建议收藏」现在项目开发,都实现前后端分离开发,导致前端向后端发送请求,会出现跨域错误;如何解决这个问题?方法一:后端可以下载cors包,对指定的前端域名允许请求;具体操作可以自行百度;今天主要介绍的是前端人员不用去麻烦后端人员,就可以通过前端设置实现跨域请求;方法二:前端设置服务器代理;本人用的是脚手架vue…

    2022年9月15日
    2
  • 卷积神经网络(3)—-经典网络

    卷积神经网络(3)—-经典网络

    2021年6月17日
    150
  • 音乐标签修改器——Mp3tag

    音乐标签修改器——Mp3tagMp3tag用于编辑音频文件元数据:批量标签编辑、在线数据库查询、根据标签信息重命名文件

    2022年7月25日
    12
  • MATLAB interp1

    MATLAB interp1小音乐MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,’method’)           其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,’method’表示采用的插值方法,MATLAB提供的插值方法有几种:’method’是最邻近插值,’linear’线性插    值;’spline’三次样条插值;’c

    2022年6月12日
    30
  • JavaFX横幅类游戏开发 教训 游戏贴图

    JavaFX横幅类游戏开发 教训 游戏贴图

    2022年1月3日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号