Android:性能典范:拯救计划

前言

今天逛稀土时偶然看到hanks分享的一篇英文文章,粗略浏览便已觉得不错,因此翻译成中文,与君分享。

原文标题:Android Performance Patterns: Rescue tips
原文地址:https://medium.com/@laanayabdrzak/android-performance-patterns-rescue-tips-8c1e4c7cb1f0#.xzvcgcall

原文作者:Abderrazak Laanaya



正文

现在的app到处都是华丽的动画、复杂的转场效果与自定义View,然而用户体验必须尽可能直观且一致。以下这些范例将会帮助你做出一个流畅、响应快速、尽可能省电的app,这些范例由一些可以提升整体应用表现的细微优化组成。

避免较差的性能

  • 避免阻塞主线程

  • 避免不必要的重绘,以免引发大范围重绘

  • 使用 RelativeLayout 以减少布局层级

  • 避免在 LinearLayout 中使用嵌套的 weight 属性(这会使得每个子View measure两次)

  • 避免不恰当地使用自定义View

  • 避免创建不必要的对象

  • 将常量声明为 static final(使用static会快 15% - 20%)

  • 使用基本数据类型(Integer、Float比基本数据类型慢两倍)

  • 避免内部的 getter setter(直接访问字段可以快3倍)

  • 优化循环语句

  • 对私有的内部类,考虑使用包访问级别代替私有访问级别

  • 谨慎使用native方法

自定义View

  • 遵循KISS原则

  • 在布局中使用merge作为根标签(避免额外的ViewGroup

  • 使用include标签(便于布局的复用)

  • 避免不必要的布局

  • 不要在onDraw中申请内存或者做复杂操作

  • 去除不必要的invalidate()调用

  • 考虑创建自己的ViewGroup

  • RecyclerView替代ListViewGridView

避免内存抖动

  • 不要创建大量不必要的以下对象:
    1, 不可变类:String
    2, 自动装箱:Integer, Boolean…

  • 考虑使用对象池并缓存来减少内存抖动

  • 留心枚举的开销(一个指向枚举的引用就要占据4个字节)

避免内存泄漏

  • 不要在内部类里泄漏context实例

  • 不要在activity里泄漏view实例

  • 使用静态内部类优于非静态的

  • 除非key都是WeakReference,否则不要使用WeakHashmap作为缓存

CPU

  • 布局嵌套层次不要过多

  • 当需要时才去进行复杂的计算【译者注:类似懒加载】

  • 缓存复杂计算的结果以复用

  • 考虑 RenderScript 的性能

  • 尽可能减少主线程的工作

避免过度绘制

  • 简化drawable

  • 透明部分使用.9图

  • 设置view的透明度时多注意

  • 去除view中无用的背景

Bitmap

  • 将bitmap解码为需要的尺寸:BitmapFactory.Options(inSampleSize, inDensity, inTargetDensity)

  • 加载bitmap到内存时,设置尺寸为显示尺寸

  • 如无必要,不要进行缩放

  • 使用LRU缓存

Service

  • 除非Service在处理任务否则不要让其保持运行。同时在任务完成时也要注意stopService

  • 系统倾向保留有Service运行的进程,那么被service占用的内存将无法被其他进程使用或被置换(paged out)

  • 限制service生命周期的最佳实践是使用IntentService,它会在工作完成后结束自身

  • 让没必要存活的Service继续运行是Android app内存管理最糟糕的设计之一

线程

  • 在线程的run()方法中使用   Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND)可以减少该线程及UI线程的计算性能损耗

  • 如果你没有通过上面这种方式设置线程为低优先级,那么该线程仍会拖慢你的app,因为默认情况下它的优先级与UI线程的优先级相同

  • 保存当前线程的引用,以便之后可以中断该线程。例如:当网络连接失败你可以取消该线程

避免ANR

  • UI线程中做的事越少越好

  • 如果应用正在执行后台任务,最好显示进度给用户(例如显示一个进度条)

  • 使用SystraceTraceview等性能工具来检测应用响应能力的瓶颈

  • 如果你的应用初始化非常耗时,考虑使用启动页或尽快显示主界面,显示加载进度的同时异步填充内容

参考文章

  • http://billynyh.github.io/tech-talks/google-android-performance-1.html

  • http://developer.android.com/training/best-performance.html

  • http://developer.android.com/training/articles/perf-tips.html








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章