android ANR产生情况、发生原因及解决办法

来源:互联网 发布:网络传输文件软件 编辑:程序博客网 时间:2024/05/10 04:24

ANR (Application Not Responding)  

ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。

ANR产生情况

在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:

1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕

发生ANR的根本原因

  • 应用进程自身引起的:

    • .调用thread的join()方法、sleep()方法、wait()方法或者其他线程持有锁或者其它线程终止或崩溃导致主线程等待超时;
    • service binder的数量达到上限,system server中发生WatchDog ANR,service忙导致超时无响应
    • 在主线程中做了非常耗时的操作:像耗时的网络访问,大量的数据读写,数据库操作,硬件操作(比如camera),耗时的计算如操作位图;
  • 其他进程引起的,比如:其他进程CPU占用率过高,导致当前应用进程无法抢占到CPU时间片。常见的问题如文件读写频繁,io进程CPU占用率过高,导致当前应用出现ANR;

ANR解决办法

虽然每个程序员都不想ANR发生在自己的头上,因此,你需要严格遵守Google提供的一系列建议,简单总结就是以下两点:

  • 不要让主线程干耗时的工作
    • Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message异步更新ui,还采用asyntask异步任务的方式) ;
    • 避免在BroadcastReceiver里做耗时的操作或计算。也不要开 子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
    • 避免在Broadcast Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现
  • 不要让其他线程阻塞主线程的执行

因此,要尽量保证主线程执行工作干净利落,一个消息循环执行时间最好不超过100ms到200ms。一般应用程序在发布之前最好对新增的功能通过Systrace+TraceView进行性能测试,这样能够及时发现程序当中的耗时操作,对于一些可能引起ANR的风险做到提前规避。

参考:
- http://m.blog.csdn.net/article/details?id=50564526
- http://www.jianshu.com/p/7fd95bc2a55c
- http://blog.sina.cn/dpool/blog/s/blog_618199e60101kvbl.html?

0 0