ANR是一种异常情况还是错误?我们能否在try{} catch(){}
结构中捕获它?
ANR是一种异常情况还是错误?我们能否在try{} catch(){}
结构中捕获它?
ANR(应用程序未响应)并不是一个错误。它是在您的应用程序非常缓慢且响应时间很长时显示的,这样会让用户等待。如果您的应用程序让用户等待很长时间,用户可能会感到不满意。因此,Android框架为用户提供了关闭您的应用程序的选项。 http://developer.android.com/guide/practices/design/responsiveness.html
当您在主线程上执行长时间运行操作时,就会出现这种情况。由于主线程被阻塞,系统无法处理用户交互。解决方法是在工作线程中执行繁重的操作,并保持主线程空闲。
应用程序未响应(ANR)对话框
可以想象,如果主线程正在进行繁重的计算或从网络套接字读取数据,则无法立即响应用户输入,例如轻按或滑动。
对用户交互不及时响应的应用程序将感到反应迟缓——超过几百毫秒的延迟是明显可见的。这是一个非常棘手的问题,因此Android平台会保护用户免受主线程负载过重的应用程序的影响。
注意:
如果应用程序在五秒内未响应用户输入,则用户将看到“应用程序未响应(ANR)”对话框,并将被提供退出应用程序的选项。
以下屏幕截图显示了典型的Android ANR对话框:
Android致力于将用户界面的重绘与硬件刷新率同步。这意味着它旨在以每秒60帧的速度重新绘制——每帧仅需16.67毫秒。如果我们在主线程上执行的工作需要接近16毫秒,那么我们就有可能影响帧率,导致卡顿动画、抖动滚动等问题。异步Android编程 - 第二版 - Helder Vasconcelos - 2016年7月