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

作者: 厘米姑娘 | 来源:发表于2017-12-30 22:02 被阅读986次

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

  • 布局优化
  • 绘制优化
  • 内存泄漏优化
    • 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最佳性能实践系列


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


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

相关文章

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

    本篇重点是性能优化,包括内容: 布局优化 绘制优化 内存泄漏优化MAT工具 响应速度优化 ListView优化 B...

  • 要点提炼|开发艺术之线程

    本篇的主要内容是Android的线程和线程池: 概述 线程形态AsyncTaskHandlerThreadInte...

  • 要点提炼|开发艺术之Window

    多数情况我们是和Activity和View打交道,在之前学习中也都接触过,本篇来深入学习和它们有紧密联系的Wind...

  • 要点提炼|开发艺术之IPC

    在上一篇Window里提及过IPC,本篇将详细总结IPC,知识点如下: IPC基础及概念多进程模式序列化Seria...

  • 要点提炼|开发艺术之Drawable

    提到Drawable,第一反应肯定是用于存放图片,实际上,Drawable还可以存放其他资源。那么本篇就来深入了解...

  • 要点提炼|开发艺术之View

    在Android中的任何一个布局、任何一个控件其实都是直接或间接继承自View的,因此View是一个很重要的概念。...

  • 要点提炼|开发艺术之 Activity

    本系列专题以提炼要点的方式总结知识点,而不做具体展开,对应的会附上个人较喜欢的文章链接供大家详细了解和学习。第一个...

  • 要点提炼|开发艺术之Animation

    在之前开发艺术之View讲滑动的时候曾简单提起过动画,本篇将依次分析和总结以下三类动画: View动画(View ...

  • 要点提炼|开发艺术之消息机制

    Android的消息机制指的是Handler的运行机制,本篇将总结Handler机制的相关知识点: 消息机制概述 ...

  • webpack 性能优化

    webpack性能优化 开发环境性能优化 生产环境性能优化 开发环境性能优化 优化打包构建速度 优化调试功能 生产...

网友评论

    本文标题:要点提炼|开发艺术之性能优化

    本文链接:https://www.haomeiwen.com/subject/lqwngxtx.html