Andriod性能优化笔记

布局优化

布局优化的思想很简单,就是尽量减少布局文件的层级。

如何进行布局优化呢?首先是删除布局中无用的空间和层级,其次有选择地使用性能较低的 ViewGroup,比如 RelativeLayout 的性能比起 LinearLayout 和 FrameLayout 就不是很好。

利用 RelativeLayout 可以减少嵌套,因为嵌套意味着增加了布局的层级。

另外,还可以使用以下几个标签

  • 标签

    布局重用

  • 标签

    减少布局层级

  • ViewStub

    按需加载

绘制优化

绘制优化是指 View 的 onDraw 方法要避免执行大量的操作。体现在两个方面

  • onDraw 中不要创建新的局部对象

    如果 onDraw 被频繁调用,会在一瞬间产生大量临时变量,会占用过多内存和导致频繁 GC。

  • onDraw 中不要做耗时任务,也不能执行成千上万次的循环操作

    View 的绘制帧率保持在 60 fps 是最佳的

内存泄漏优化

常见例子:

  • 静态变量导致的内存泄漏

    public class MainActivity extends Activity {
    	
      	private static Context sContext;
    
    	public void onCreate(Bundle savedInstanceState) {
          	super.onCreate(savedInstanceState);
      		...
            
    		sContext = this;
    	}
    }
    
    public class MainActivity extends Activity {
    	
      	private static View sView;
    
    	public void onCreate(Bundle savedInstanceState) {
          	super.onCreate(savedInstanceState);
      		...
            
            sView = new View(this);
    	}
    }
    
  • 单例模式导致的内存泄漏

    Activity 实现某个接口并向单例 Test 注册监听。由于缺少解注册的操作所以会引起内存泄漏。因为 Activity 的对象被单例 Test 所持有,而单例模式的特点是生命周期和 Application 保持一致。因此 Activity 的对象无法被及时释放。

  • 属性动画导致的内存泄漏

    属性动画中有一类无限循环动画,如果没有在 onDestroy() 中停止动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画效果了。而且这个时候,Activity 的 View 被动画持有,而 View 又持有了 Activity,最终 Activity 无法被释放。

    解决办法:在 Activity 的 onDestroy 中调用 animator.cancel() 来停止动画。

响应速度优化

核心思想是避免在主线程中做耗时操作。否则就会出现 ANR。

ANR 发生的时候,系统会在 /data/anr 目录下创建一个文件 traces.txt,可以利用 MAT 来分析这个文件找出原因。

posted @ 2016-09-27 22:42  勇敢的少年啊  阅读(173)  评论(0编辑  收藏  举报