要点提炼|开发艺术之性能优化

本篇重点是性能优化,包括内容:

  • 布局优化
  • 绘制优化
  • 内存泄漏优化
    • MAT工具
  • 响应速度优化
  • ListView优化
  • Bitmap优化
  • 线程优化
  • 其他

1.布局优化

a.核心思想:尽量减少布局文件的层级

b.方式:

  • 多嵌套情况下可使用RelativeLayout减少嵌套。
  • 布局层级相同的情况下使用LinearLayout,它比RelativeLayout更高效。
  • 使用<include>标签重用布局、<merge>标签减少层级、<ViewStub>标签懒加载。详见布局篇--布局原则

补充实例 Android最佳性能实践--布局优化技巧


2.绘制优化

a.核心思想:避免在View.onDraw()中执行大量的操作。

b.方式:

  • 避免创建新的局部对象,因为onDraw()可能被多次调用而产生大量的临时对象,导致占用过多内存、系统频繁gc,降低了执行效率。
  • 避免做耗时任务,以及大量循环操作。

3.内存泄漏优化

a.内存泄漏(Memory Leak):程序在申请内存后,无法释放已申请的内存空间。是造成应用程序OOM的主要原因之一。

内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用。

补充阅读内存溢出和内存泄漏的区别

b.可能原因:

  • 静态变量导致的内存泄漏
    • 详情:一个静态变量又是非静态内部类会一直持有对外部类的引用,导致外部类Activity无法被回收。
    • 解决办法:将内部类设为静态内部类或独立出来;使用context.getApplicationContext()
  • 单例模式导致的内存泄漏
    • 详情:单例传入参数this来自Activity,使得持有对Activity的引用。
    • 解决办法:传参context.getApplicationContext()
  • 属性动画导致的内存泄漏
    • 详情:没有在onDestroy()中停止无限循环的属性动画,使得View持有了Activity。
    • 解决办法:在Activity.onDestroy()中调用Animator.cancel()停止动画。
  • Handler导致的内存泄漏
    • 详情:Message持有对Handler的引用,而非静态内部类的Handler又隐式持有对外部类Activity的引用,使得引用关系会保持至消息得到处理,从而阻止了Activity的回收。
    • 解决办法:使用静态内部类+WeakReference弱引用;当外部类结束生命周期时清空消息队列。
  • 线程导致的内存泄漏
  • 资源未关闭导致的内存泄漏
    • 详情:未及时注销资源导致内存泄漏,如BraodcastReceiver、File、Cursor、Stream、Bitmap等。
    • 解决办法:在Activity销毁的时候要及时关闭或者注销。
  • Adapter导致的内存泄漏

c.方式:

  • 在开发过程中避免写出内存泄漏的代码,可参考以上多种解决办法。
  • 通过分析工具如MAT寻找潜在的内存泄漏。

推荐阅读常见的内存泄漏原因及解决方法


4.响应速度优化

a.核心思想:避免在主线程中做耗时操作。

b.方式:开线程


5.ListView优化

  • 复用ViewHolder,具体使用
  • 不要在getView()中执行耗时操作;
  • 开启硬件加速。

综合实例提高ListView性能的技巧


6.Bitmap优化

  • 利用BitmapFactory.Options的inSampleSize属性,根据需求对图片进行采样后再加载进来。详见Bitmap的高效加载

7.线程优化


8.其他

  • 避免创建过多的对象 ;
  • 不要过多使用枚举,枚举占用的内存空间要比整型大;
  • 常量请使用static final来修饰;
  • 使用一些Android特有的数据结构,比如SparseArray和Pair等,它们都具有更好的性能;
  • 适当使用软引用和弱引用;
  • 采用内存缓存和磁盘缓存;
  • 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露。

推荐阅读Android开发性能优化总结Android最佳性能实践系列


最后,是有助于提高程序可维护性的几点建议,一起共勉:


希望这篇文章对你有帮助~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,847评论 25 709
  • 性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化- 内存优化 性能分析工具 - Trac...
    JackChen1024阅读 1,437评论 1 20
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,472评论 0 12
  • 一弯新月钩两秋, 心思难解徒悠悠。 是非本是旁人事, 无心何必苦相求。
    青衫几度阅读 206评论 3 3
  • 下课了,走出教学楼的我,发现这场雨下的不小,比淅淅沥沥大,比哗哗啦啦小。 我撑起了事先预备好的伞,开始在雨中慢步,...
    行走的光阴阅读 246评论 0 0

友情链接更多精彩内容