ANR产生的原因及其定位分析

一、前言:

       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文件进行分析定位。

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值