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

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

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

1.布局优化java

a.核心思想:尽可能减小布局文件的层级git

b.方式:github

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

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


2.绘制优化性能优化

a.核心思想:避免在View.onDraw()中执行大量的操做。数据结构

b.方式:工具

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

3.内存泄漏优化布局

a.内存泄漏(Memory Leak):程序在申请内存后,没法释放已申请的内存空间。是形成应用程序OOM的主要缘由之一。post

内存溢出(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最佳性能实践系列


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


但愿这篇文章对你有帮助~

相关文章
相关标签/搜索