本文主要讲解ANR即Application Not Responding和自动化测试工具Monkey的相关内容。
一、ANR(Application Not Responding)
在Android上,如果你的应用程序有一段时间响应不够灵敏(5秒内没有输入响应事件),系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。Handlermessage或者BroadcastReceiver处理过程时间超过十秒也会引起。
避免方法:运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。
IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
二、自动化测试工具Monkey
1、什么是Monkey
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
2、Monkey的特征
1)测试的对象仅为应用程序包,有一定的局限性。
2)Monky测试使用的事件流数据流是随机的,不能进行自定义。
3)可对MonkeyTest的对象,事件数量,类型,频率等进行设置。
3、Monkey的基本用法
$ adb shell monkey –p(包) your.package.name –v(频率) 500
4、Monkey测试的停止条件
Monkey Test执行过程中在下列三种情况下会自动停止:
1)如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
3)如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。