[译]Android 性能典范:拯救计划
来源:互联网 发布:教师网络研修平台登录 编辑:程序博客网 时间:2024/05/30 04:16
原文地址:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=405608694&idx=1&sn=92940ebda7f7f7b53d22fbb79fc248f5&scene=0#wechat_redirect
前言
今天逛稀土时偶然看到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
替代ListView
和GridView
避免内存抖动
不要创建大量不必要的以下对象:
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线程中做的事越少越好
如果应用正在执行后台任务,最好显示进度给用户(例如显示一个进度条)
使用Systrace或Traceview等性能工具来检测应用响应能力的瓶颈
如果你的应用初始化非常耗时,考虑使用启动页或尽快显示主界面,显示加载进度的同时异步填充内容
参考文章
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
- [译]Android 性能典范:拯救计划
- Android 性能典范:拯救计划
- Android:性能典范:拯救计划
- Android性能典范:拯救计划
- Android 性能典范:拯救计划
- Android 性能典范:拯救计划
- Android 性能典范:拯救计划
- Android 性能典范:拯救计划
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- Android性能优化典范
- hdu--2501--Tiling_easy version
- 3.1.13 时间管理
- Oracle学习笔记【02】:单行函数
- 汇总IOS之文件管理
- 如何处理服务器SSL收到了一个弱临时Diffie-Hellman 密钥?
- [译]Android 性能典范:拯救计划
- C++ 引用的作用和用法
- JMS使用ActiveMQ实现Queue和Topic两种模式
- JavaScript初学笔记(1)
- 第三次实验
- 简单快捷PHP数组赋值方法详解
- 常用在线工具整理
- hibernate5(10)注解映射[2]一对多单向关联
- LeetCode Merge Two Sorted Lists