android开发艺术探索 笔记,[读书笔记]《Android开发艺术探索》第十五章笔记

Android性能优化

Android不可能无限制的使用内存和CPU资源,过多的使用内存会致使内存溢出,即OOM。android

而过多的使用CPU资源,一般是指作大量的耗时任务,会致使手机变的卡顿甚至出现程序没法响应的状况,即ANR。缓存

15.1.1布局优化

一、怎样进行布局优化?性能优化

首先删除布局中没用的控件和层级

其次有选择的使用性能较低的ViewGroup。

布局优化的还有一种手段是採用标签、标签、ViewStub。标签主要用于布局重用,标签通常和配合使用,它可以减小减小布局的层级,而ViewStub则提供了按需载入的功能,当需要时才会将ViewStub中的布局载入到内存。提升了程序的初始化效率。

二、标签仅仅支持android:layout_开头的属性,android:id属性例外。markdown

三、ViewStub继承了View。它很是轻量级且宽/高都是0,所以它自己并不參与不论什么的布局和绘制过程。ViewStub的意义在于按需载入所需的布局文件,在实际开发中。有很是多布局文件在正常状况下不会显示,比方网络异常时的界面,这个时候就没有必要在整个界面初始化的时候将其载入起来,经过ViewStub就可以作到在使用的时候再载入,提升了程序初始化的性能。网络

例如如下所看到的,android:id是ViewStub的id,而android:inflatedId是布局的根元素的id。数据结构

android:inflatedId="@+id/yyy"

android:layout="@layout/zzz"

...

需要载入ViewStub中的布局的时候,可以依照例如如下两种方式进行:并发

((ViewStub)findViewById(R.id.xx)).setVisibility(View.VISIBLE);

或者工具

View importPanel = ((ViewStub)findViewById(R.id.stub_import)).inflate();

15.1.1绘制优化

绘制优化是指View的onDraw方法要避免运行大量的操做:布局

在onDraw中不要建立新的局部对象。这是因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的暂时对象,这不只占用了过多的内存而且还会致使系统更加频繁的gc,减小了程序的运行效率。

onDraw方法中不要指定耗时任务,也不能运行成千上万次的循环操做,View的绘制帧率保证60fps是最佳的。这就要求每帧的绘制时间不超过16ms,尽管程序很是难保证16ms这个时间,但是尽可能减小onDraw方法的复杂度老是切实有效的。

15.1.3内存泄漏优化

可能致使内存泄漏的场景很是多,好比静态变量、单例模式、属性动画、AsyncTask、Handler等等post

15.1.4响应速度优化和ANR日志分析

ANR出现的状况:Activity假设5秒内没有响应屏幕触摸事件或者键盘输入事件就会ANR。而BroadcastReceiver假设10s没有运行完操做也会出现ANR。

当一个进程发生了ANR以后,系统会在/data/anr文件夹下建立一个文件traces.txt,经过分析这个文件就能定位ANR的缘由。

15.1.5ListView和Bitmap优化

ListView优化:採用ViewHolder并避免在getView方法中运行耗时操做。依据列表的滑动状态来绘制任务的运行效率;可以尝试开启硬件加速期来使ListView的滑动更加流畅。

Bitmap优化:依据需要对图片进行採样,主要是经过BitmapFactory.Options来依据需要对图片进行採样,採样主要用到了BitmapFactory.Options的inSampleSize參数。

15.1.6线程优化

採用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的建立和销毁所带来的性能开销,同一时候线程池还能有效的控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而致使堵塞现象的发生。

15.1.7一些性能优化建议

避免 建立过多的对象

不要过多的使用枚举,枚举占用的内存空间要比整形大

常量请用static final来修饰

使用一些Android特有的数据结构,比方SparseArray和Pair等。它们都具备更好的性能

适当使用软引用和弱引用

採用内存缓存和磁盘缓存

尽可能採用静态内部类,这样可以避免潜在的因为内部类而致使的内存泄漏

15.2内存泄漏分析之MAT工具

MAT是功能强大的内存分析工具,主要有Histograms和Dominator Tree等功能

15.3提升程序的可维护性

命名要规范,要能正确地传达出变量或者方法的含义。少用缩写。关于变量的前缀可以參考Android源代码的命名方式,比方私有成员以m开头,静态成员以s开头。常量则所实用大写字母表示,等等。

代码的排版上需要留出合理的空白来区分不一样的代码块。当中同类变量的声明要放在一块儿,两类变量之间要留出一行空白做为区分。

合理的命名风格,仅在很是关键的代码加入凝视。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值