什么触发ANR通常系统会在应用无法对用户输入响应时显示ANR。比如如果一个应用在I/O操作上阻塞了(频繁请求网络)UI线程,系统无法处理用户输入事件或者,在UI线程中app花了夶量时间在构建复杂的类,或在游戏中计算下一个动作保证这些操作高效是很重要的,但最高效的代码也需要花费时间
在任何情况下,都不要在UI线程执行耗时任务取而代之的是创建 一个工作线程,在这个线程里操作这可以保持UI线程运行,阻止系统因为代码卡住而结束应用
Android应用默认运行在单线程里,叫UI线程或主线程这意味着,你的应用所有工作都在UI线程里如果花费很长时间才能完成,会触发ANR,因為此时应用无法操控输入事件或广播
因此,UI 线程里的任何方法都应该尽可能地做轻量的工作,特别是Activity在生命周期方法,像onCreate(),onResume().潜在的耗时操作潒网络,数据库或昂贵的计算(像改变图片大小)应该在工作线程里完成(或者在数据库操作案例里,通过一个异步请求)
执行这个工作线程,只需要创建一个实例调用 execute():
如果你实现Thread或HandlerThread,确保UI线程没有因为等待工作线程执行完而阻塞不要调用Thread.wait()或Thread.sleep(),而是提供一个Handler,供任务执行完后回調。如此设计UI线程会保持响应,避免出现ANR对话框
提示:你可以用StrictMode帮你找到在UI线程上潜在的耗时操作
}