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

时间:2011-06-30 19:28:56

标签: android exception catch-block android-anr-dialog

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

2 个答案:

答案 0 :(得分:46)

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

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

答案 1 :(得分:3)

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

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

对用户交互没有快速响应的应用程序会感觉到 没有反应 - 任何超过几百毫秒的延迟 显。这是Android平台保护的一个有害问题 来自在主线程上执行过多操作的应用程序的用户。

注意:

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

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

enter image description here

Android很难同步用户界面重绘与 硬件刷新率。这意味着它的目标是以每帧60帧的速度重绘 第二 - 每帧只有16.67毫秒。如果我们在主线程上工作 在接近16毫秒的任何地方,我们都有可能影响帧速率,从而导致抖动 动画,生涩的滚动,等等。

理想情况下,当然,我们并不想放弃一个框架。 Jank,没有反应, 尤其是ANR,提供了非常差的用户体验,转化为 糟糕的评论和不受欢迎的应用程序。构建Android时的生活规则 应用程序是:不要阻塞主线程!

注意:

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

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

来源:

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