“ANR”是一个例外还是一个错误还是什么?

ANR是一个例外,一个错误还是什么? 我们可以通过try{} catch(){}结构来捕捉它吗?

Solutions Collecting From Web of "“ANR”是一个例外还是一个错误还是什么?"

ANR (应用程序没有响应)不完全是一个错误。 当您的应用程序非常缓慢并且需要大量时间来响应时才会显示,从而使用户等待。 如果您的应用程序等待很长时间,用户将不会感激。 所以,Android框架为用户提供了closures应用程序的选项。 http://developer.android.com/guide/practices/design/responsiveness.html

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

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

正如你可以想象的,如果主线程忙于大量计算或者从networking套接字读取数据,它不能立即响应用户input,例如轻击或滑动。

对用户交互没有快速响应的应用程序将感觉不到响应 – 任何超过几百毫秒的延迟都是显而易见的。 这是一个有害的问题,Android平台可以保护用户免受在主线程上做太多的应用程序的侵害。

注意 :

如果应用程序在5秒内没有响应用户input,用户将看到“应用程序不响应”(ANR)对话框,并将提供退出应用程序的选项。

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

在这里输入图像说明

Android努力将用户界面重绘与硬件刷新率同步。 这意味着它的目标是以每秒60帧的速度重新绘制 – 每帧只有16.67毫秒。 如果我们在16毫秒左右的主线程上工作,我们就会影响帧速率,从而导致口吃不畅,animation滚动,等等。

理想情况下,我们当然不想放弃一个框架。 Jank,反应迟钝,尤其是ANR,提供了非常差的用户体验,这意味着糟糕的评论和不受欢迎的应用程序。 构buildAndroid应用程序时遵循的规则是:不要阻塞主线程!

注意 :

Android在每个设备上的“开发人员选项”中提供了有用的严格模式设置,当应用程序在主线程上执行长时间运行操作时,这些设置将在屏幕上闪烁。

通过引入一个新的Exception类,NetworkOnMainThreadException,在系统检测到主线程上启动的networking活动时抛出的RuntimeException的子类,在Honeycomb(API级别11)中向平台添加了进一步的保护。

资源 :

asynchronousAndroid编程 – 第二版 – Helder Vasconcelos – 2016年7月