精通安卓性能优化-第一章(七)

响应

性能不是单纯的速度问题。只要你的应用显示给用户的速度很快,它将会被认为很快。想要做到显示速度快,应用必须响应灵敏。比如,为了显示得快,可以直到需要的时候才给对象分配内存,一种被叫做懒汉式初始化的技巧。在程序开发过程中,你最希望发现的就是在性能敏感的地方有执行较慢的代码。

如下几个类被认为是大多数Android应用的基石:
(1) Application
(2) Activity
(3) Service
(4) ContentProvider
(5) BroadcastReceiver
(6) Fragment (Android 3.0及以上)
(7) View

这些类里特别令人感兴趣的是所有的onSomething()方法,它们都被主线程调用,比如onStart()和onFocusChanged()。主线程,或者称为UI线程,是你的应用程序主要所在的线程。尽管不被推荐,但是有可能你的所有代码都运行在主线程。除了其他事情,主线程:
(1) 接收键盘消息(比如,View.onKeyDown()和Activity.onKeyLongPress())
(2) 画View (View.onDraw())
(3) 生命周期事件发生(比如,Activity.onCreate())

NOTE:设计上许多方法在主线程被调用。当你重写一个方法,可以验证它如何被调用的。安卓文档不会经常指定一个方法是否在主线程被调用。

通常,主线程持续的接收发生了什么事情的通知,不管事件是系统产生的还是用户产生的。应用只有一个主线程,所有的事件按顺序处理。也就是说,现在很容易看出为什么响应可能成为负面影响:队列中的第一个事件会在随后的事件处理之前被处理,每次处理一条。如果某个事件需要很长时间,当它被处理的时候,其他事件就需要等待更长的时间。

一个简单的例子是在主线程调用computeRecursivelyWithCache()。当n很小的时候,运行速度很快,随着n的增长逐渐变慢。当n非常大的时候,你很可能将会面对Android非常著名的ANR(Application Not Responding)对话框。当Android检测到你的应用程序没有反应的时候,这个对话框会出现,即Android发现一个输入事件5秒钟之内没有处理或者一个Broadcast Receiver 10秒钟没有结束执行。当ANR发生的时候,用户可以简单的选择继续等待或者强制关掉应用(这可能是导致应用被卸载的第一步)。

优化activity的所有启动序列函数非常重要,包括如下的调用:
(1) onCreate
(2) onStart
(3) onResume

当然,这些序列发生在activity被创建的时候,实际上执行次数可能比你想象的要多。比如当配置发生变化的时候,你当前的activity会被销毁,一个新的实例被创建,如下的序列调用会发生:
(1) onPause
(2) onStop
(3) onDestroy
(4) onCreate
(5) onStart
(6) onResume

这些序列执行的越快,用户就可以越快的重新使用你的应用程序。最常见一个配置改变是方向改变,这标志着设备已经被旋转了。

NOTE:应用程序可以指定它的activity配置改变的时候可以自己去处理,通过manifest中的android:configChanges属性。这将导致onConfigurationChanged()的调用而不是将activity销毁。

应用activity的onCreate()方法很可能包含setContentView( )调用或者其他负责inflate资源的方法。因为inflate资源是一个相对耗时的操作,可以通过减少布局的复杂性使得inflation更快(layout文件,定义了你的应用的样子)。简化布局文件复杂性的方法包括:
(1) 使用RelativeLayout而不是单纯的LinearLayout,保持Layout尽量"flat"。不只减少了对象的分配数量,同样使得事件的处理更快。
(2) 使用ViewStub避免对象的创建(参考懒汉式初始化部分)

NOTE:尤其要注意ListView项的布局,因为在List中可能有很多项。使用SDK的layoutopt(SDK16以后使用lint)工具去分析你的布局。

基本的原则是保证任何在主线程的事情完成的尽可能的快,目的是保证应用的响应。然而,这经常被认为是在主线程做尽量少的事情。在大多数情况下,可以通过简单的将操作移动到其他的线程或者延缓操作,达到应用的响应性,这两个技巧通常不会导致代码更难维护。在将一个任务移动到另外一个线程之前,确保你理解为什么这个任务执行很慢。如果这是因为不好的算法或者不好的实现,你需要修正它,因为如果仅仅是将任务移动到另外一个线程,就像将灰尘扫到柜子底下一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值