什么是ANR?如何避免ANR?

来源:互联网 发布:网络编辑主要做什么的 编辑:程序博客网 时间:2024/05/17 23:51

让你的APP保持敏捷,这是谷歌文档给出的标题。

一、现在我们就来探究一下什么是ANR(Appliction Not Responding)?

Appliction Not Responding直译过来的意思就是应用程序没有响应,在Android中,如果你的应用程序在在一段时间响应不够灵敏,系统会向用户显示一个对话框(如下图所示),

用户可以选择"Wait"等待程序响应,也可以点击"OK"强制关闭该应用程序。所以在一个合理流畅的应用程序是不应该出现ANR异常,让用户每次都处理这个对话框,这样是一种非常差的用户体验。所以,在程序中避免ANR是非常必要的。

那么是什么引起ANR的呢?

在任何情况下,你的应用程序都不不应该在UI线程上执行一个潜在的耗时操作,但可以自己创建一个线程并在其中做大部分工作,这将保持UI线程(驱动用户界面事件循环)运行,并防止系统的结束。

在Android系统中,应用程序响应性是由活动管理器和窗口管理器系统服务监视的。Android中显示ANR对话框为特定的应用程序,当它检测到下列条件之一:

1. 在5秒内对输入事件(如按键或屏幕触摸事件)没有响应

2. 一个BrocastReceiver在10秒以内还没有执行完成

二、如何避免ANR?

Android应用程序通常在一个单一线程上运行,默认的是"UI线程"(主线程),这意味着你的应用程序在UI 线程中,需要很长的时间来完成可能触发的ANR对话框,因为你的应用没有给自己机会来处理输入事件或广播。因此,在UI线程中运行的任何方法都应该在该线程上尽可能少的工作。特别是所有的Activity应尽可能少的在关键的生命周期方法(如OnCreate()和OnResume()方法)中设置潜在的长时间运行的操作,例如网络或数据库操作或进行高耗时的计算,它们都应该通过一个子线程或者异步请求来完成。此处可以使用Handler,在子线程中完成相应的操作以后,就可以发送一个Message给主线程,让主线程来继续执行之后的操作。




1 0
原创粉丝点击