ANR产生的原因及其定位分析
2017-07-10 09:39
495 查看
一、前言:
ANR是安卓中独有的概念,全称Application NO Responding(应用无响应),如何定位和避免出现这个问题是Android程序员的必备修养。
二、 ANR产生的原因:
1、ANR产生的原因:
只有当应用程序的UI线程响应超时才会引起ANR,超时产生的原因有两种:
第一、当前事件没有机会处理,例如UI线程正在响应另外的事件,当前事件被某个事件给阻塞掉了。
第二、当前事件正在处理,但是由于耗时太长没有能及时的完成。
2、产生原因分类:
根据产生时间不同,超时时间也不同,可以分为
1:KeyDispatchTimeout(5 seconds) --主要类型
按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) --小概率类型
Service在特定的时间内无法处理完成
3、KeyDispatchTimeout
Akey or touch event was not dispatched within the specified
time(按键或触摸事件在特定时间内无响应)
具体的超时时间的定义在framework下的
ActivityManagerService.Java
//How long we wait until we timeout on key dispatching.
staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000
三:如何避免KeyDispatchTimeout
1:UI线程尽量只做跟UI相关的工作
2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互
四、典型的ANR问题场景:
1、应用程序UI线程存在耗时操作,例如在UI线程中进行网络请求,数据库操作或者文件操作等。可能会导致用户无法处理用户输入等。
2、应用程序UI线程等待子线程释放某个锁,从而无法处理用户的请求的输入。
3、耗时操作的动画,需要大量的计算工作,可能导致CPU负载过重。
五:UI线程
说了那么多的UI线程,那么哪些属于UI线程呢?
UI线程主要包括如下:
1.Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
2.AsyncTask: onPreExecute(), onProgressUpdate(),
onPostExecute(), onCancel,etc
3. Mainthread handler: handleMessage(), post*(runnable r), etc
4. other
六、ANR的定位和分析
当发生ANR的时候,开发者可以结合Logcat日志和生成的定位于手机内部的/data/anr/traces.txt文件进行分析定位。
ANR是安卓中独有的概念,全称Application NO Responding(应用无响应),如何定位和避免出现这个问题是Android程序员的必备修养。
二、 ANR产生的原因:
1、ANR产生的原因:
只有当应用程序的UI线程响应超时才会引起ANR,超时产生的原因有两种:
第一、当前事件没有机会处理,例如UI线程正在响应另外的事件,当前事件被某个事件给阻塞掉了。
第二、当前事件正在处理,但是由于耗时太长没有能及时的完成。
2、产生原因分类:
根据产生时间不同,超时时间也不同,可以分为
1:KeyDispatchTimeout(5 seconds) --主要类型
按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) --小概率类型
Service在特定的时间内无法处理完成
3、KeyDispatchTimeout
Akey or touch event was not dispatched within the specified
time(按键或触摸事件在特定时间内无响应)
具体的超时时间的定义在framework下的
ActivityManagerService.Java
//How long we wait until we timeout on key dispatching.
staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000
三:如何避免KeyDispatchTimeout
1:UI线程尽量只做跟UI相关的工作
2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互
四、典型的ANR问题场景:
1、应用程序UI线程存在耗时操作,例如在UI线程中进行网络请求,数据库操作或者文件操作等。可能会导致用户无法处理用户输入等。
2、应用程序UI线程等待子线程释放某个锁,从而无法处理用户的请求的输入。
3、耗时操作的动画,需要大量的计算工作,可能导致CPU负载过重。
五:UI线程
说了那么多的UI线程,那么哪些属于UI线程呢?
UI线程主要包括如下:
1.Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
2.AsyncTask: onPreExecute(), onProgressUpdate(),
onPostExecute(), onCancel,etc
3. Mainthread handler: handleMessage(), post*(runnable r), etc
4. other
六、ANR的定位和分析
当发生ANR的时候,开发者可以结合Logcat日志和生成的定位于手机内部的/data/anr/traces.txt文件进行分析定位。
相关文章推荐
- ANR产生的原因及其定位分析
- Android中ANR产生的原因以及定位分析和检测
- Android ANR产生的原因以及其定位分析
- ANR产生的原因及定位分析
- Android ANR产生的原因及定位分析
- 基于android7.0流程分析anr产生原因
- 邮件乱码产生的原因及其分析
- ANR异常产生的原因及其解决办法
- 案例分析:校内网崛起原因及其发展前景
- SQL*Net message from client 事件产生的原因分析
- 软件测试错误的类型及其产生的原因
- 文件空洞产生的原因分析
- 凭证中估价差额产生的原因及其冲回方法
- Java基础——孙鑫谈Java中文乱码问题产生原因分析(一)
- Windows7蓝屏后产生的.dmp文件如何打开并准确分析导致蓝屏原因所在?
- GDI+编程中的一条错误信息及其原因分析
- Java基础——孙鑫谈Java中文乱码问题产生原因分析(二)
- MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法
- LNK2001链接错误产生的原因分析和解决办法
- SQL Server 2005 扫描计数产生原因分析(1)