您的位置:首页 > 移动开发 > Android开发

Android SDK开发指南(翻译)系列一:最佳实践(二)-- 反应速度设计

2010-07-24 16:08 756 查看
 

 

    可以编写代码,赢得世界上每一个性能测试,但当他们尝试使用该应用程序仍发出愤怒。这是应用程序响应不够 - 感觉呆滞,挂起或重要时段,或时间过长进程的投入冻结。

    在Android,系统防止应用程序一段时间反应不够快,显示一个对话框给用户,称为Application Not Responding(ANR)对话框。用户可以选择让应用程序继续进行,但用户不会一定需要每次都运行你的AP。因此,重要的是要注意设计你的应用程序的响应能力,使系统从来没有一个ANR的原因,以显示给用户。

    一般来说,如果一个应用程序不能响应用户输入,系统会显示一个ANR。例如,如果对某些I / O操作(通常一个网络接入)的应用程序块,然后在主应用程序线程将不能够处理传入的用户输入事件。过了一段时间,系统的结论是,应用程序已挂起,并显示了ANR给用户选择的杀死进程。

同样,如果你的应用程序花费太多时间精心建立在内存中的结构,或者在游戏中计算的下一步行动时,系统会认为你的应用程序已挂起。它总是重要的是要确保这些计算是有效利用上述技术,但即使是最有效的代码仍然需要时间来运行。

在这两种情况,解决方法是通常创建一个子线程,做你最耗时的工作。这样可以使主线程(即驱动器的用户界面的事件循环)运行,并可以防止系统已被冻结。由于这些线程通常class级完成的,你的反应可以看作一个类(class)问题。 (对比基本的性能,这是上述作为一项方法级的关注。)



一个ANR对话框显示给用户。

本文件讨论了如何在Android系统确定是否应用程序没有响应,并作为确保您的应用程序响应的指导方针。

这份文件涵盖以下主题:

•什么触发ANR?

•如何避免ANR

•加强反应能力

 

什么触发ANR?

在Android,应用程序的响应情况是由Activity Manager和Window Manager系统提供服务。当它检测到下列条件之一,Android将显示特定的应用程序ANR对话框:

•没有一个输入事件(如按键,触摸屏在5秒钟内)响应

•BroadcastReceiver 10秒内没有执行完成

 

如何避免ANR

    鉴于上述ANR定义,让我们来看看为什么这可以发生在Android应用程序,以及如何最好地安排你的应用程序,以避免ANR。     Android应用程序完全在一个单一的(即主)线程运行正常。这意味着,任何应用程序在主线程需要较长时间才能完成的ANR可以触发对话框的工作,因为AP未给自己一个机会来处理输入事件或意向书播出。     因此,任何方法,在主线程运行应尽可能少做工作。特别是,Activities应该尽可能少设立关键生命周期的方法,如OnCreate()和onResume()。潜在的长期运行,例如网络或数据库操作,或消耗昂贵的计算操作,如缩放位图应该做一个子线程(或通过一个异步请求, 操作的数据库)。但是,这并不意味着您的主线程应该阻止而子线程完成等待 - 你也不应该调用Thread.wait()或Thread.sleep()方法。而不是阻碍,同时又为子线程等待完成,你的主线程应该为子线程提供一个Handler来在完成后回发。您以这种方式设计的应用程序将允许您的主线程依然允许输入,从而避免了5秒输入事件超时导致ANR的对话框。这些相同的做法应遵循的任何其他显示用户界面线程,因为他们也受到同样的超时限制。

关于具体的执行时间限制的IntentReceiver强调的正是:小,在后台工作离散量,如保存设置或注册一个通知。只要在主线程调用的其他方法,应用程序应避免潜在长期运行的操作或BroadcastReceivers计算。通过子线程作一个密集型任务(BroadcastReceiver是短暂的),您的应用程序应该启动一个Service,如果需要在响应一个意向广播后,启动一个潜在的长期运行的操作。作为一个方面说明,你也应该避免启动一个Activity从一开始就启动Intent Receiver,因为这将产生一个新的画面窃取当前用户运行焦点。如果您的应用程序对Intent broadcast,有一定的反应,应该用Notification Manager。

 

加强反应能力 

•一般而言,100至200ms的是门槛之外,用户将在应用程序中看到的滞后(或缺乏“snappiness”)。因此,这里是超出了你应该做的,以避免ANR,这将有助于使你的申请一些额外的提示似乎顺应用户。 

•如果您的应用程序是在后台做响应用户的输入工作,表明正在取得进展(ProgressBar和ProgressDialog这是很有用的)。 

•专为游戏,在子线程做移动计算。 

•如果您的应用程序有一个费时的初始安装阶段,考虑初始屏幕显示弹出框或使其尽可能快的呈现main view,并异步填入信息。无论是哪种情况,你应表明某种正在取得的进展,以免用户看到该应用程序被冻结。

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: