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

综合技术 简书 (源链)

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

  • 布局优化
  • 绘制优化
  • 内存泄漏优化

    • MAT工具
  • 响应速度优化
  • ListView优化
  • Bitmap优化
  • 线程优化
  • 其他

1.布局优化

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

b.方式:

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

补充实例: 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销毁的时候要及时关闭或者注销。

      • BraodcastReceiver:调用 unregisterReceiver()
        注销;
      • Cursor,Stream、File:调用 close()
        关闭;
      • Bitmap:调用 recycle()
        释放内存(2.3版本后无需手动)。
  • Adapter导致的内存泄漏

c.方式:

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

    寻找潜在的内存泄漏。

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

4.响应速度优化

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

b.方式:开线程。

5.ListView优化

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

综合实例: ListView终极优化方法

6.Bitmap优化

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

7.线程优化

  • 采用线程池,避免存在大量的Thread。详见线程&线程池

8.其他

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

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

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

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

您可能感兴趣的

Testing Your Android App’s Readiness for Int... Google are serious about the global reach of Android. They place translation services front and center in the dev console for Android app publishin...
Google Play license when changing the paid applica... I currently have two versions of an application - a free version with ads and a paid version with no ads. I've had a ton of requests from users to eas...
Parameter passing with the sqlite.execS... i want use an insert or replace query, here i m giving the code that i have String sql="insert or replace into Stock_Table values (?,?,?,?,?,?)";...
自定义View 实现多塔机监控类似星轨雷达扫描... 最近公司业务要实现塔机监控功能 自己写了一个自定义view 它会根据你设置 的数据大小自动画圆 数据list. size是1画一个圆 这里我传了4组数据 里面用到了弧度计算 和角度计算都在代码里 它的基本原理是根据ValueAnimator 动画动态绘制图形 废话不多说 直...
Angular 4 Tutorial – Handling Refresh Token with N... One of the very cool new features that came out in Angular 4.3 was the HttpInterceptor. Of course this isn’t new to Angular 1 developers who had it ...
简书责编内容来自:简书 (源链) | 更多关于

阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 要点提炼|开发艺术之性能优化



专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录