ANR

出现类型:

1、按键或触摸事件在规定事件内未响应。

2、BroadcastReceiver在特定时间内未完成处理。

3、小概率service在特定时间内为完成处理。

  常见的超时引发的ANR

Activity: onCreate(), onResume(), onDestroy(), 
onKeyDown(), onClick()等,超时时间5s

Application: onCreate(), onTerminate()等,超时时间5s

Service: onCreate(), onStart(), onDestroy()等,超时时间20s

BroadcastReceiver:onReceiver(),前台APP广播超时时间是10s,后台App是60s

  AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()等,超时5s
  Mainthread handler: handleMessage(), post*(runnable r)等,超时5s

导致原因:

1、高耗时的操作,如图像变换

2、磁盘读写,数据库读写操作

3、大量的创建新对象

如何避免:

1、UI线程尽量只做跟UI相关的工作

2、耗时的操作(比如数据库操作,I/O,连接网络或者别的有可能阻塞UI线程的操作)把它放在单独的线程处理

3、尽量用Handler来处理UIThread和别的Thread之间的交互

4、解决的逻辑

(1)使用AsyncTask

  在doInBackground()方法中执行耗时操作

  在onPostExecuted()更新UI

(2)使用Handler实现异步任务

  在子线程中处理耗时操作

  处理完成之后,通过handler.sendMessage()传递处理结果

  在handler的handleMessage()方法中更新UI

  或者使用handler.post()方法将消息放到Looper中

捕获ANR异常信息:

  app在产生ANR异常后,会将异常信息写入"/data/anr/traces.txt"文件我们可以通过收集用户的这个文件,就可以来获取用户产生ANR的地方了。

posted @ 2017-07-17 16:44  yl007  阅读(157)  评论(0编辑  收藏  举报