您的位置:首页 > 移动开发 > Android开发

Android稳定性问题---ANR问题分析

2017-12-13 15:11 591 查看
1、程序产生ANR的原因

    只要应用程序的主线程响应超时,就会产生anr问题,一般子线程的阻塞或者缓慢,只要不影响主线程,一般不会产生anr问题。

2、ANR的类型

    ANR分为两类:1、用户输入事件超时;2、获取窗口焦点超时。

    输入事件超时:用户输入事件,长时间无相应,会通过一系列回调通知WMS的notifyANR函数报告ANR发生。

   获取窗口焦点超时:目的是获取新的窗口,但是在前一个activity的pause,或者焦点窗口resume时间太长。

3、广播超时

  当应用程序主线程在执行BroadcastReceiver的onReceive方法时,超时没有执行完毕,就会报出广播超时类型的ANR。对于前台进程超时时间是10秒,后台进程超时时间是60秒。如果需   
要完成一项比较耗时的工作,应当通过发送Intent给应用的Service来完成,而不应长时间占用OnReceive主线程。与前两类ANR不同,系统对这类ANR不会显示对话框提示,仅在slog中输出异常信息。

4、service超时
  在onstart(),oncreate(),onStop()中如果耗时超过20s没有返回结果,就会爆出anr问题,不会出现提示框,仅仅在log中体现。

5、conttentProvider超时

  当主线程在执行ContentProvider相关操作时没有在规定的时间内执行完毕就会发生ANR。

6、anr问题出现的场景
    6.1、数据库操作尽量采用异步的方式去做;

    6.2、初始化的数据或者控件太多,尽量简化树形结构,采用线程池异步的方式去做;

    6.3、大量的创建线程和大对象;

    6.4、对大数据排序或者循环;

    6.5、访问网络;

    6.6、主线程等待子线程的锁。

    6.7、系统性能差也会导致anr的发生

以上只是自己解决anr问题时的总结,具体问题还的结合anr第一现场去具体分析。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: