24

ANR 是异常、错误还是什么?我们真的可以在try{} catch(){}结构中捕捉它吗?

4

2 回答 2

49

ANR(应用程序无响应)并不完全是错误。当您的应用程序非常缓慢并且需要很长时间才能响应时会显示它,从而使用户等待。如果您的应用程序让他们等待很长时间,用户将不会感激。因此,Android 框架为用户提供了关闭应用程序的选项。 http://developer.android.com/guide/practices/design/responsiveness.html

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

于 2011-06-30T19:53:39.767 回答
3

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

可以想象,如果主线程忙于繁重的计算或从网络套接字读取数据,它无法立即响应用户输入,例如点击或滑动。

不能快速响应用户交互的应用程序会感觉没有响应——任何超过几百毫秒的延迟都是显而易见的。这是一个非常有害的问题,以至于 Android 平台会保护用户免受在主线程上执行过多操作的应用程序的影响。

注意 :

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

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

在此处输入图像描述

Android 努力使用户界面重绘与硬件刷新率同步。这意味着它旨在以每秒 60 帧的速率重绘——即每帧仅 16.67 毫秒。如果我们确实在接近 16 毫秒的主线程上工作,我们可能会影响帧速率,从而导致卡顿——动画卡顿、滚动不顺畅等等。

当然,理想情况下,我们不想丢掉一帧。Jank、无响应,尤其是 ANR,提供了非常糟糕的用户体验,这会转化为差评和不受欢迎的应用程序。构建 Android 应用程序时要遵守的一条规则是:不要阻塞主线程!

注意 :

Android 在每个设备的开发者选项中提供了一个有用的严格模式设置,当应用程序在主线程上执行长时间运行的操作时,它会在屏幕上闪烁。

Honeycomb(API 级别 11)中的平台添加了进一步的保护,引入了一个新的异常类 NetworkOnMainThreadException,它是 RuntimeException 的子类,如果系统检测到在主线程上启动的网络活动,则会抛出该异常。

资源 :

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

于 2016-10-26T07:43:05.867 回答