前言:
本编文章纯粹个人见解,如有错误或者不到位的地方,请大家指出,多谢。
ANR:
就是 程序没有响应 的英文缩写。在android上,这是一个系统警告提示。
产生:
一般是因为主线程(UI线程)进行耗时操作(网络或I/O和数据库操作等)导致的。
当Activiy Manager和Window Manager监控到以下情况,就会弹出ANR提示框。
1:KeyDispatchTimeout(5 seconds) –主要类型
按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds)
BroadcastReceiver 在特定时间内无法处理完成
3:ServiceTimeout(20 seconds)
Service 在特定的时间内无法处理完成
除此之外,还有 ContentProvider,只是一般很少见,
广播和服务,在后台启动的时候,时间会是 60s。
定位分析:
1.看log日志,搜索Activity Manager会有很多关于CPU使用率和ANR相关信息。
2.在android路径 /data/anr/trace.txt 文件里分析,这里就比较高深,涉及到堆栈之类的。
避免:
1.在UI线程只有UI操作,其他耗时操作交给子线程去做。
2.BroadcastReceiver生命周期只有10秒,如需进行耗时操作,应发送Intent给Service,由Service来完成。
工具:
子线程完成耗时操作后,需要在主线程显示信息。
此时可以用到以下一些工具:
1.Handler
2.runOnUiThread(); 这是一个异步消息处理机制的接口封装,原理跟handler一样。
3.AsyncTask 这是Android一个更方便的工具,里面方法条理清晰,用法简单。
4.EventBus
5.RxJava
Thanks:
以上内容部分摘取自以下网址: