ANR 是异常、错误还是什么?我们真的可以在try{} catch(){}
结构中捕捉它吗?
2 回答
ANR(应用程序无响应)并不完全是错误。当您的应用程序非常缓慢并且需要很长时间才能响应时会显示它,从而使用户等待。如果您的应用程序让他们等待很长时间,用户将不会感激。因此,Android 框架为用户提供了关闭应用程序的选项。 http://developer.android.com/guide/practices/design/responsiveness.html
当您在主线程上执行长时间运行的操作时,会发生这种情况。由于主线程被阻塞,系统在此期间无法处理用户交互。解决方案是在工作线程中执行繁重的操作并保持主线程空闲。
应用程序无响应 (ANR) 对话框
可以想象,如果主线程忙于繁重的计算或从网络套接字读取数据,它无法立即响应用户输入,例如点击或滑动。
不能快速响应用户交互的应用程序会感觉没有响应——任何超过几百毫秒的延迟都是显而易见的。这是一个非常有害的问题,以至于 Android 平台会保护用户免受在主线程上执行过多操作的应用程序的影响。
注意 :
如果应用程序在五秒内没有响应用户输入,用户将看到应用程序无响应 (ANR) 对话框,并提供退出应用程序的选项。
以下屏幕截图显示了一个典型的 Android ANR 对话框:
Android 努力使用户界面重绘与硬件刷新率同步。这意味着它旨在以每秒 60 帧的速率重绘——即每帧仅 16.67 毫秒。如果我们确实在接近 16 毫秒的主线程上工作,我们可能会影响帧速率,从而导致卡顿——动画卡顿、滚动不顺畅等等。
当然,理想情况下,我们不想丢掉一帧。Jank、无响应,尤其是 ANR,提供了非常糟糕的用户体验,这会转化为差评和不受欢迎的应用程序。构建 Android 应用程序时要遵守的一条规则是:不要阻塞主线程!
注意 :
Android 在每个设备的开发者选项中提供了一个有用的严格模式设置,当应用程序在主线程上执行长时间运行的操作时,它会在屏幕上闪烁。
Honeycomb(API 级别 11)中的平台添加了进一步的保护,引入了一个新的异常类 NetworkOnMainThreadException,它是 RuntimeException 的子类,如果系统检测到在主线程上启动的网络活动,则会抛出该异常。
资源 :
异步 Android 编程 - 第二版 - Helder Vasconcelos - 2016 年 7 月