天天看点

什么是ANR,如何避免ANR

关于 ANR 确实是一件令人头痛的事情,以下是我对 ANR 的认识,希望能帮助大家学习。

什么是 ANR ?

ANR:应用程序无响应(Application Not Responding)。

首先,在 Android 中活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。

如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应对话框。

用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

什么时候会产生 ANR ?

1、程序出现异常

2、界面操作等待响应时间超过 5 秒

3、HandleMessage 回调函数的执行超过 10 秒

如何避免 ANR ?

1、在主线程中尽可能少做事情,特别是在 onCreate() 和 onResume() 中。高耗时的操作应在子线程中做(如:网络连接、数据库等)

(注意:在子线程中做,不是说你的主线程阻塞在那里等待子线程的完成,也不是调用 Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。 )

2、IntentReceiver 在后台里做小的、琐碎的工作

3、避免在 IntentReceiver 中启动一个Activity。

(因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。 )

4、避免在 BroadcastReceiver 中做耗时操作或计算。

(但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver)

在应用程序中,100 到 200 是用户能感知的阻滞时间阔值。如果应用程序为响应用户输入正在后台工作的话,可以显示工作进度(ProgressBar 或 ProgressDialog)。