如果有一段时间程序点击不够灵敏,系统就会向用户显示一个对话框,而这个对话框的内容就是anr(Application not responding)
让用户选择等待程序继续运行,同时也可以选择关闭对话框终止程序运行
结果就是非常影响用户体验
Activity最长时间五秒
广播最长的执行时间10秒
这篇文章分析了源码,ANR原理分析
简单说就是主线程做了耗时操作,无法在规定时间内完成,造成ANR
一、主线程被IO操作(4.0之后网络IO不允许在主线程中运行)阻塞
二、主线程中存在耗时的计算,比如一些网络数据读取
Activity的所有生命周期回调都是执行在主线程
Service默认执行在主线程
BroadCastReceiver的onReceive回调是执行在主线程
没有使用子线程的looper的Handler的handleMessage方法和post(Runnable)也是执行在主线程,很好理解
AsyncTask的方法里除了doInBackground,其他都是执行在主线程中
使用AsyncTask 处理耗时IO操作
使用Thread或者HandlerThread提高优先级
可以使用Thread和HandlerThread来处理耗时操作,区别是HandlerThread自带Looper,可以创建Handler发送消息
使用Handler处理工作线程的耗时任务
在Activity的onCreate和onResume方法中尽量避免耗时的代码