• 【Android优化篇】提升Activity加载速度的方法


    文章转自:http://www.jianshu.com/p/2007ca0290d3 作者: CoderFan

    前言

    这个也是我面试遇到的问题,当时只回答了一种情况,异步加载数据,没想到别的方式,回来以后专门研究了一下。

    正文

    Activity加载速度是很影响用户体验的,也是衡量一款APP质量的重要指标之一,所以优化Activity加载速度至关重要。

    既然要优化首先需要了解Activity的生命周期,这里我昨天整理的有一篇文章Android四大组件之Activity—生命周期篇大家可以看看,从生命周期很明显可以看到,Activity一个完整的生命周期中onCreate(Bundle)onResume()onPause()使用比较频繁,另外onStart()因为负责的事情比较少,这里就不列入考虑。Activity之间跳转、回退都会频繁调用onResume()onPause(),因此这两个方法中不宜做过多耗时操作,而onCreate(Bundle)中更是Activity启动后进行初始化布局的工作。

    综上,不难总结出以下几个优化方向:

    1、耗时操作要进行异步处理,尽量在onCreate(Bundle)方法中减少耗时操作,在onResume()也不可进行过多操作。

    2、布局文件不可过于臃肿,必须布局优化

    3、视图加载优化

    4、另外,有时候我们会用到自定义控件,所以一定要进行绘制优化

    耗时操作优化

    Android是不允许在UI线程也就是主线程进行耗时操作的(例如网络请求、IO操作等等),因此要采用异步加载的方式来进行,官方推荐使用的有HandlerAsyncTaskThread等,市场上也有很多第三方框架可供我们使用,比如RxJava,都是很不错的解决方案,这里具体用法不再多说。

    布局优化

    布局优化很简单,结合《开发艺术探索》和文末的参考文献的文章大致有如下思路:
    1、删除多余的无用控件和层级
    2、include标签
    3、merge标签
    4、ViewStub

    第一点很明显,用不到的控件和层级只会浪费渲染时间,删除为好。

    第二点和第三点,include和merge两个最好配合使用,include减少视图重用,merge帮助include减少视图层级,比如include所引用布局中根布局和include引用到的布局根布局重复,使用merge可以有效解决这个问题。

    最后ViewStub可以帮助我们延迟加载暂时无用的视图,比如主页加载数据为零,要展示空数据页面,空页面不是一开始就必须加载的,可以借用ViewStub在需要加载的时候进行渲染并显示。

    延迟加载优化

    延迟加载除了视图优化中用到的ViewStub外,还有一些其他情况,比如侧滑菜单,刚开始是不可见的,用户点击或者滑动之后才会出现,这就是不必马上加载的,可以在获取到侧滑菜单处于可见状态的时候进行加载。另外Fragment懒加载情况也是很好的优化办法。

    自定义控件优化

    随着用户对APP的要求越来高,自定义控件几乎是每个APP的必备,因此自定义View带来的问题也随之增多,比如由此导致的OOM,内存泄露等等。这里只讨论自定义控件的绘制优化,主要是针对onDraw()里的优化:
    1、不要在onDraw()进行大量的操作,不要创建过多的局部对象,这会导致大量的内存开销,从而导致系统频繁的GC,拉低程序执行效率

    2、不要在onDraw()进行耗时操作!好吧,很明显耗时操作在Android开发中是时刻都需要注意的问题。

    3、减少循环操作,成千上万次的循环会很占用CPU的时间,导致绘制不流畅。

    慎用多线程

    这是文末参考文献提到的,尽量不要在一个app内使用多进程!这块我不熟就不多说了,先挖个坑在这里。

    总结

    其实提升Activity加载速度的方法就那么多,但是这是一个需要不断进行的操作,随着我们的项目开发总是会有新的需要优化的地方,良好的用户体验关系到用户的忠诚度。

    以上方法有我以前开发项目中实际用到的,结合网上查阅资料,翻阅书籍总结的,如果有不对的地方大家直接评论打脸就好。

    参考文献

    1、提升进入界面的速度

  • 相关阅读:
    MAC下通过改apache配置文件切换php多版本的方法
    mac配置php7运行环境
    VS Code 配置 C/C++ 环境(转)
    go语言中goroute使用:=遇到的坑
    python中执行shell的两种方法总结
    对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加u202a解决办法
    在macOS下正确配置 VS Code 使用 virtualenv 里的 python 环境参数
    github上传时出现error: src refspec master does not match any解决办法
    VSCode tasks.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等
    Sonar入门(四):Eclipse集成Sonar
  • 原文地址:https://www.cnblogs.com/1925yiyi/p/7448654.html
Copyright © 2020-2023  润新知