和你一起终身学习,这里是程序员Android
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
本篇文章主要介绍 Android
开发中的 ANR 部分知识点,通过阅读本篇文章,您将收获以下内容:
1.ANR 是什么
1.ANR 是什么
ANR 是Application Not Responding的简称。
当Android应用程序的UI线程被阻止时间太长时,将触发“应用程序无响应”(ANR)错误。如果应用程序位于前台,则系统会向用户显示一个对话框,如图1所示。ANR对话框使用户有机会强制退出该应用程序。
图1.向用户显示的ANR对话框
ANR是一个问题,因为负责更新UI的应用程序主线程无法处理用户输入事件或绘制,从而使用户感到沮丧。有关应用主线程的更多信息,请参阅进程和线程。
发生以下情况之一时,将为您的应用触发ANR:
当您的活动处于前台时,您的应用BroadcastReceiver在5秒钟内未响应输入事件或(例如按键或屏幕触摸事件)。
虽然前台没有活动,但是您BroadcastReceiver还没有在相当长的时间内完成执行。
如果您的应用遇到ANR,则可以使用本文中的指导来诊断和解决问题。
2. 检测和诊断问题
Android提供了多种方法来让您知道您的应用存在问题,并帮助您进行诊断。如果您已经发布了应用程序,则Android vitals可以提醒您发生问题,并且有诊断工具可以帮助您发现问题。
Android vitals
当您的应用程序展示出过多的ANR时 ,Android生命体可以通过Play控制台提醒您,从而提高应用程序的性能 。在以下情况下,Android vitals认为ANR过多:
在每天至少0.47%的时间里展示至少一种ANR。
在每天至少0.24%的时间内展示2个或更多ANR。
一个日常的会话是指在使用你的应用程序的日子。
有关Google Play如何收集Android生命数据的信息,请参阅 Play控制台文档。
3.诊断ANR
诊断ANR时,需要寻找一些常见的模式:
该应用程序正在执行涉及主线程上I / O的慢速操作。
该应用程序正在主线程上进行长时间的计算。
主线程正在对另一个进程进行同步调用,而另一个进程要花很长时间才能返回。
主线程被阻塞,等待另一个线程上正在进行的长时间操作的同步块。
主线程与另一个线程处于死锁状态,无论是在您的进程中还是通过绑定程序调用。主线程不仅等待长时间的操作完成,而且处于死锁状态。有关更多信息,请参见 Wikipedia上的死锁。
以下技术可以帮助您找出导致ANR的原因是哪些。
StrictMode
使用StrictMode有助于您在开发应用程序时在主线程上查找意外的I / O操作。您可以StrictMode在应用程序或活动级别使用。
启用后台ANR 弹窗
仅当在设备的“ 开发人员”选项中启用了“ 显示所有ANR”时,Android才会为需要花费太长时间才能处理广播消息的应用程序显示ANR对话框。因此,并非总是向用户显示后台ANR对话框,但是该应用仍可能遇到性能问题。<