“ANR”是异常还是错误,或者是什么?

24

ANR是一种异常情况还是错误?我们能否在try{} catch(){}结构中捕获它?


1
你忘记提及你正在使用的平台了。 - Matti Virkkunen
请在您的Logcat中查找“我/Choreographer(xxx):跳过了xxx帧!应用程序可能在其主线程上做太多的工作。”,这可能会帮助您找到问题所在。 - Christ
好像这是一个“什么”。 - Kirby
2个回答

49

ANR(应用程序未响应)并不是一个错误。它是在您的应用程序非常缓慢且响应时间很长时显示的,这样会让用户等待。如果您的应用程序让用户等待很长时间,用户可能会感到不满意。因此,Android框架为用户提供了关闭您的应用程序的选项。 http://developer.android.com/guide/practices/design/responsiveness.html

当您在主线程上执行长时间运行操作时,就会出现这种情况。由于主线程被阻塞,系统无法处理用户交互。解决方法是在工作线程中执行繁重的操作,并保持主线程空闲。


3

应用程序未响应(ANR)对话框

可以想象,如果主线程正在进行繁重的计算或从网络套接字读取数据,则无法立即响应用户输入,例如轻按或滑动。

对用户交互不及时响应的应用程序将感到反应迟缓——超过几百毫秒的延迟是明显可见的。这是一个非常棘手的问题,因此Android平台会保护用户免受主线程负载过重的应用程序的影响。

注意:

如果应用程序在五秒内未响应用户输入,则用户将看到“应用程序未响应(ANR)”对话框,并将被提供退出应用程序的选项。

以下屏幕截图显示了典型的Android ANR对话框:

enter image description here

Android致力于将用户界面的重绘与硬件刷新率同步。这意味着它旨在以每秒60帧的速度重新绘制——每帧仅需16.67毫秒。如果我们在主线程上执行的工作需要接近16毫秒,那么我们就有可能影响帧率,导致卡顿动画、抖动滚动等问题。
当然,理想情况下,我们不希望丢失任何一帧。卡顿、反应迟钝,尤其是ANR,都会给用户带来非常糟糕的体验,从而导致差评和不受欢迎的应用程序。构建Android应用程序的一个生存法则是:不要阻塞主线程!
注意:
Android在每个设备的开发者选项中提供了一个有用的严格模式设置,当应用程序在主线程上执行长时间操作时,屏幕会闪烁显示。
在Honeycomb(API级别11)中,平台增加了更多保护措施,引入了一个新的异常类NetworkOnMainThreadException,它是RuntimeException的子类,如果系统检测到在主线程上启动网络活动,则会抛出该异常。
来源:

异步Android编程 - 第二版 - Helder Vasconcelos - 2016年7月


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接