前言
ANR是Android中一个独有的概念,它的全称是Application Not Responding(应用程序无响应)。
相信从事Android开发的同学,或多或少都遇到过,对于高质量的代码,ANR在开发者自测过程中可能不会经常遇到,但一旦测试人员进行Monkey测试,ANR出现的概率就比较高了,如何快速分析定位并解决,是开发者的必修课。
ANR的直观体验是用户在操作APP的过程中,感觉界面卡顿,比如按下某个按钮,打开某个页面等,当卡顿超过一定时间(一般是5秒)时就会出现ANR对话框,如下图所示:
这时查看Logcat,一般可以发现ANR以及traces.txt等字样。可以发现,出现ANR主要是因为我们在主线程中做了耗时操作。这时你可以选择“等待”按钮,等待应用程序结束主线程耗时操作,或者选择“确定”按钮,结束这个应用程序。
1、ANR产生的原因
只有当应用程序的UI线程响应超时才会引起ANR,超时产生原因一般有两种:
· 当前的事件没有机会得到处理,列如UI线程正在响应另外一个事件,当前事件由于某种原因被阻塞了。
· 当前的事件正在处理,但是由于耗时太长没能及时完成。
根据ANR产生的原因不同,超时时间也不尽相同,从本质上讲,产生ANR的原因有三种