简单处理anr的流程
1.首先应用发生anr的情况有如下几种:
Service中各生命周期函数执行超过20s。
BroadcastReceiver的onReceiver()超过10s;
用户的输入在5s内没被App响应;
上面信息来自
遇到anr我们的姿势应该是什么样子呢?
1.首先我们需要导出anr的日志,anr问题的log一般都在/data/anr/目录下,所以我们输入如下adb 命令:
adb pull /data/anr/traces.txt d:/ 导出到d盘
导出后的文件大约是这样子的:
----- pid 2677 at 2017-07-21 17:38:10 ----- //发生的日期
Cmd line: cn.xxx.xxx //哪个应用
"main" prio=5 tid=1 NATIVE //找这个下面的那段日志
at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555)
at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437)
at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522) 。。。。//这后面应该会有相关的信息,会提示到具体的类和方法
到了这里基本上已经定位到问题的所在了,然后就是去项目里找具体问题了。
总结
一般无响应都是UI线程中做了耗时操作,不过由于以前的机器性能还没那么好,所以会出现较多的anr,现在机器性能比较好,一般不会出现,如果出现了也不要担心,多数是把问题代码放到线程中就好了,如有问题欢迎反馈,谢谢!!