什么是ANR?
|
|
ANR的类型
ANR一般有三种类型:
KeyDispatchTimeout
A key or touch event was not dispatched within the specified time(按键或触摸事件在特定时间内无响应)
具体的超时时间的定义在framework下的ActivityManagerService.java
|
|
为什么会超时呢?
超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:
|
|
如何避免KeyDispatchTimeout
|
|
UI线程
说了那么多的UI线程,那么哪些属于UI线程呢?
UI线程主要包括如下:
|
|
如何去分析ANR
先看个LOG:
|
|
从LOG可以看出ANR的类型,CPU的使用情况,如果CPU使用量接近100%,说明当前设备很忙,有可能是CPU饥饿导致了ANR
如果CPU使用量很少,说明主线程被BLOCK了
如果IOwait很高,说明ANR有可能是主线程在进行I/O操作造成的
除了看LOG,解决ANR还得需要trace.txt文件,
如何获取呢?可以用如下命令获取
|
|
adbpull data/anr/traces.txt ./mytraces.txt
从trace.txt文件,看到最多的是如下的信息:
|
|
说明主线程在等待下条消息进入消息队列
Thread状态
|
|
如何调查并解决ANR
|
|
案例
- 案例1:关键词:ContentResolver in AsyncTask onPostExecute, high iowait
原因:IOWait很高,说明当前系统在忙于I/O,因此数据库操作被阻塞
原来:
|
|
解决后:
|
|
关于AsyncTask:http://developer.android.com/reference/android/os/AsyncTask.html
- 案例2:关键词:在UI线程进行网络数据的读写
|
|
关于网络连接,在设计的时候可以设置个timeout的时间或者放入独立的线程来处理。
关于Handler的问题,可以参考:http://developer.android.com/reference/android/os/Handler.html
- 案例3:关键词:Memoryleak/Thread leak
|
|
分析:
atdalvik.system.VMRuntime.trackExternalAllocation(NativeMethod)内存不足导致block在创建bitmap上
MEMINFO in pid 1360 [android.process.acore]
native dalvik other total
size: 17036 23111 N/A 40147
allocated: 16484 20675 N/A 37159
free: 296 2436 N/A 2732
解决:如果机器的内存族,可以修改虚拟机的内存为36M或更大,不过最好是复查代码,查看哪些内存没有释放
感谢
本篇博客转自于下http://www.cnblogs.com/purediy/p/3225060.html
感谢作者的总结和分享!