Android 设计思想
2010-06-17 03:29:00 来源:WEB开发网关于如何构造快速响应的Android应用的文章对此作了更详细的描述。
构造快速响应的Android应用
本文中,我们将讨论Android如何判断程序没有响应的情况(以下被称作ANR),ANR产生的原因,以及确保你的程序能够快速响应的几条准则。这里有一些很好的实践?有助于书写快速响应的Android代码?能够帮助你建立款速响应的用户界面。在我们探寻细节之前,先来看一看Android 提示ANR的对话框是什么样子:
Image:Http://code.google.com/android/images/anr.png
“好”程序也会变成“坏”程序
在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
如何避免ANR
基于以上对ANR的定义,让我们来探寻一下产生ANR的原因,以及如何架构你的程序以力求避免ANR的发生。
通常情况下,Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。
IntentReciever在这方面有特殊的要求。它强调在执行期间,它只在后台完成很小的、细粒度的操作如保存一个设置或注册一个通知。所以如果其他在主线程中被调用的方法一样,IntentReciever也需要避免进行耗时的操作和计算。但与前面使用子线程的方法不同(因为
更多精彩
赞助商链接