美文网首页Android知识进阶
Android ANR 分析(什么是ANR,如何避免ANR)

Android ANR 分析(什么是ANR,如何避免ANR)

作者: 小池laucherish | 来源:发表于2020-08-07 11:22 被阅读0次

    什么是ANR

    在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application NotResponding)对话框。
    用户可以选择让程序继续运行,但是,他们在使用你的
    应用程序时,并不希望每次都要处理这个对话框。因此
    ,在程序里对响应性能的设计很重要这样,这样系统就不会显示ANR给用户。

    为什么会ANR

    不同的组件发生ANR的时间不一样,Activity是5秒,BroadCastReceiver是10秒,Service是20秒(均为前台)。

    • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
    • 主线程中存在耗时的计算
    • 主线程中错误的操作,比如Thread.wait或者Thread.sleep等 Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框
    • 应用在5秒内未响应用户的输入事件(如按键或者触摸)
    • BroadcastReceiver未在10秒内完成相关的处理
    • Service在特定的时间内无法处理完成 20秒

    怎么解决ANR:

    如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。

    1、使用AsyncTask处理耗时IO操作。

    2、使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

    3、使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

    4、Activity的onCreate和onResume回调中尽量避免耗时的代码。
    BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。

    将所有耗时操作,比如访问网络,Socket通信,查询大量SQL 语句,复杂逻辑计算等都放在子线程中去,然后通过handler.sendMessage、runonUIThread、AsyncTask、RxJava等方式更新UI。无论如何都要确保用户界面的流畅
    度。如果耗时操作需要让用户等待,那么可以在界面上显示度条。

    相关文章

      网友评论

        本文标题:Android ANR 分析(什么是ANR,如何避免ANR)

        本文链接:https://www.haomeiwen.com/subject/awhfdktx.html