【问题标题】:Is "ANR" an exception or an error or what?“ANR”是异常还是错误或什么?
【发布时间】:2011-06-30 19:28:55
【问题描述】:

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

【问题讨论】:

  • 你忘了说你使用的是什么平台。
  • 查找“I/Choreographer(xxx):跳过 xxx 帧!应用程序可能在其主线程上做太多工作。”在你的日志中。这可能会帮助您找到问题。
  • 看起来是“什么”

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    无法快速响应用户交互的应用程序会感觉 无响应——任何超过几百毫秒的延迟都是 显。这是Android平台保护的如此有害的问题 来自在主线程上执行过多操作的应用程序的用户。

    注意:

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

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

    Android 努力将用户界面重绘与 硬件刷新率。这意味着它旨在以每 60 帧的速率重绘 秒——每帧只有 16.67 毫秒。如果我们确实在主线程上工作 在接近 16 毫秒的任何地方,我们都会冒着影响帧速率的风险,从而导致卡顿——卡顿 动画、生涩的滚动等等。

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

    注意:

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

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

    来源:

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

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 2011-02-04
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多