zoukankan      html  css  js  c++  java
  • Android性能优化

    影响性能的因素:

    响应事件和TPS(每秒处理的事务数)

    性能调试方式:

    (1) 降低执行时间
    又包括几小类

    a. 利用多线程并发或分布式提高 TPS
    b. 缓存(包括对象缓存、IO 缓存、网络缓存等)
    c. 数据结构和算法优化
    d. 性能更优的底层接口调用,如 JNI 实现
    e. 逻辑优化
    f. 需求优化

    (2) 同步改异步,利用多线程提高TPS

    (3) 提前或延迟操作,错峰提高TPS

    1、合理管理内存

    (1)合理使用Service来执行后台任务,只有当任务正在执行的时候才应该让Service运行起来。可以使用IntentService,当后台任务执行结束后会自动停止,避免了Service的内存泄漏。

    (2)当界面不可见时释放内存,将所有和界面相关的资源进行释放。重写Activity的onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发说明用户离开了程序,此时就可以进行资源释放操作了。

    (3)避免在Bitmap上浪费内存 读取一个Bitmap图片的时候,千万不要去加载不需要的分辨率。可以压缩图片等操作。

    (4)使用优化过后的数据集合工具类,如SparseArray、SparseBooleanArray、LongSparseArray。

    (5)知晓内存的开支情况

    • 使用枚举通常会比使用静态常量消耗两倍以上的内存,尽可能不使用枚举
    • 任何一个Java类,包括匿名类、内部类,都要占用大概500字节的内存空间
    • 任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会在一定程序上影响内存的
    • 使用HashMap时,即使你只设置了一个基本数据类型的键,比如说int,但是也会按照对象的大小来分配内存,大概是32字节,而不是4字节,因此最好使用优化后的数据集合。

    (6)谨慎使用抽象编程,避免占用更多内存,降低运行效率。

    (7)量避免使用依赖注入框架,搜寻注解时,会经历较长的初始化过程。

    (8)谨慎使用多进程。实现多进程,只需要在Manifast文件的应用程序组件声明一个android:process属性就可以了。进程名可以自定义,但是之前要加个冒号,表示该进程是一个当前应用程序的私有进程。

    2.代码优化

    (1)避免创建不必要的对象

      如果有需要拼接的字符串,那么可以优先考虑使用StringBuffer或者StringBuilder来进行拼接。

      尽量使用基本数据类型来代替封装数据类型。

      基本数据类型的数组也要优于对象数据类型的数组。

    (2)静态优于抽象

    (3)对常量使用static final修饰符

    (4)使用增强型for循环语法

      Tips:ArrayList手写的循环比增强型for循环更快,其他的集合没有这种情况。因此默认情况下使用增强型for循环,而遍历ArrayList使用传统的循环方式。

    (5)多使用系统封装好的API

    (6)避免在内部调用Getters/Setters方法

    3.布局优化

    (1)重用布局文件  

      include标签提取公共布局,编写布局文件时应该让嵌套的层数越少越好。

    (2)仅在需要时才加载布局

      viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
      viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。

    (3)删除不必要的layout节点

      在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer(下面布局调优工具中有具体介绍)或设置->开发者选项->显示布局边界查看。

      merge标签可用于两种典型情况:
        a.  布局顶结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容试图的parent view就是个FrameLayout,所以可以用merge消除只剩一个。
        b.  某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。

    (4)去除不必要的嵌套和View节点
      首次不需要使用的节点设置为GONE或使用viewstub
      使用RelativeLayout代替LinearLayout
      大约在Android4.0之前,新建工程的默认main.xml中顶节点是LinearLayout,而在之后已经改为RelativeLayout,因为RelativeLayout性能更优,且可以简单实现LinearLayout嵌套才能实现的布局。

    (5)减少不必要的infalte
      对于inflate的布局可以直接缓存,用全部变量代替局部变量,避免下次需再次inflate

      ListView提供了item缓存

  • 相关阅读:
    flume,kafka不在一个内网互相打通.md
    尚硅谷Flink2020教程.md
    常用命令.md
    四象限工作效率-事件管理.md
    甘特图目标实施-进度管控.md
    PDCA循环法.md
    SMART大目标拆解小目标.md
    基于内外部竞争环境和竞争条件下的态势分析
    使用Java正则表达式批量提取文本信息
    使用markdown高效编写博客(创建标题)
  • 原文地址:https://www.cnblogs.com/yl-saber/p/7196190.html
Copyright © 2011-2022 走看看