第十五章 Android 性能优化

  1. 程序不可能无限制地使用内存和CPU资源,过多地使用内存会导致程序溢出,即OOM。过多地使用CPU资源,一般是指做大量的耗时任务,会导致手机变得卡顿甚至出现程序无法响应的情况,即ANR。
  2. 内存泄漏不会导致程序功能异常,但是会导致 Android 程序的内存占用过大,这将提高内存溢出的发生几率。

15.1 Android 的性能优化方法

1.1 布局优化
布局优化的思想很简单,就是尽量减少层级。
1. 删除布局中无用的控件和层级
2. 有选择地使用性能较低的 ViewGroup,比如RelativeLayout。如果布局中既可以使用LinearLayout又可以使用Relativelayout,那么采用LinearLayout;很多时候通过一个LinearLayout或者FrameLayout无法实现产品效果,需要通过嵌套的方式来完成,建议采用RelativeLayout,因为ViewGroup的嵌套增加了布局层级,同样会降低程序的性能。
3. 采用标签、标签和ViewStub
:主要用于布局重用
+ :降低减少布局的层级。当前布局和被包含布局保持同个方向(竖直、水平)
ViewStub:提供按需加载的功能。当需要时才会将ViewStub的布局加载到内存,提高了程序的初始化效率。
1.2 绘制优化
绘制优化是指 View 的 onDraw 方法要避免执行大量的操作。
1. onDraw中不要创建新的局部对象。
2. onDraw方法中不要做耗时任务,也不能执行成千上万次的循环操作。
1.3 内存泄漏优化
1. 避免写出有内存泄漏的代码
2. 通过分析工具比如MAT 来找出潜在的内存泄漏继而解决。
场景1 静态变量导致的内存泄漏
场景2 单例模式导致的内存泄漏
场景3 属性动画导致的内存泄漏
1.4 响应速度优化和 ANR 日志分析
响应速度优化的核心思想是避免在主线程中做耗时操作。
1. 将耗时操作放在线程中执行。
2. 响应速度过慢更多体现在 Activity 的启动速度上面,如果在主线程做太多事情,会导致 Activity 启动时出现黑屏现象,甚至出现ANR。
3. Activity 5秒内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR。
BroadcastReceiver 如果10秒之内未执行完操作也会出现ANR。
Service 20秒
4. 当一个进程发生了ANR,系统会在/data/anr目录下创建一个traces.txt 文件。adb pull /data/anr/traces.txt导出traces.txt文件。比如子线程和主线程抢占同步锁的时候,如果子线程首先抢到锁并执行耗时操作,可能会导致主线程产生ANR。
1.5 ListView 和 Bitmap 优化
1. 采用 ViewHolder 并避免在 getView 中执行耗时操作。
2. 要根据列表的滑动状态控制任务的执行频率。比如当列表快速滑动时显然不适合开启大量的异步任务。
3. 尝试开启硬件加速使ListView的滑动更为流畅。
Bitmap的优化参照第十二章。
1.6 线程优化
线程优化的思想是采用线程池,避免在程序中创建大量的线程。
线程池的详细介绍参照第十一章内容。
1.7 性能优化建议
1. 避免创建过多的对象
2. 不要过多使用枚举,枚举占用的内存空间要比整型大。
3. 常量使用 static final 修饰。
4. 适当使用软引用和弱引用
5. 采用内存缓存和磁盘缓存
6. 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏。
代码

https://mp.csdn.net/mdeditor

内存泄漏分析值MAT工具

MAT全称是Eclipse Memory Analyzer。
1. 打开DDMS界面,选中要分析的进程,然后单击 Dump HPROF file 按钮。可导出一个 hprof 后缀的文件
2. 导出的hprof文件不能被MAT直接识别,需要通过 hprof-conv 命令转换一下。( hprof-conv.exe 是Android SDK提供的工具,位于platform-tools目录下 )

hprof-conv C:\Users\11516\Desktop\mat\com.why.a15_android_improve.hprof C:\Users\11516\Desktop\mat\com.why.a15_android_improve-conv.hprof
  1. 使用MAT打开转换后的文件。
    Histogram:直观看出内存中不同类型的 buffer 的数量和占用的内存的大小。
    Dominator Tree:把内存中的对象按照从大到小的顺序进行排序,并且可以分析对象之间的引用关系,内存泄漏便可通过Dominator Tree来分析。
  2. 查找内存泄漏
    Path To GC Roots 过程中之所以选择排除弱引用和软引用,是因为两者都有较大可能被gc回收掉,并不能造成内存泄漏。
    这里写图片描述
    这里写图片描述

  3. 支持搜索。如果已经知道是 Activity 造成的内存泄漏,
    这里写图片描述
    详细内存分析见大牛博客

https://blog.csdn.net/yxz329130952/article/details/50288145

提高程序的可维护性

可读性
1. 命名规范,少用缩写。比如:私有成员以 m 开头,静态成员以 s 开头,常量则全部用大写字母等。
2. 代码的排版上需要留出合理的空白区分不同的代码块,同类变量的声明放在一组,两类变量之间留出一行空白
3. 仅为非常关键的代码添加注释。
层次性
一段业务逻辑,分成几个子逻辑,做到单一职责。
恰当使用设计模式可以提高代码的可维护性和可拓展性,常见的设计模式有很多,比如:单例模式、工厂模式以及观察者模式等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值