ANR的定义:

在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

如何避免:

首先来研究下为什么它会在android的应用程序里发生和如何最佳构建应用程序来避免ANR.
android应用程序通常是运行在一个单独的线程(例如:main)里,这就意味你的应用程序所做的事情如果在主线程里占用了大长时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。

因此,运行在主线程里的任何访求都尽可能少做事情。特别是,activity应该在它的关键生命周期方法(onCreate()和onResume())里尽可能少的去作创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成---也不是调用Thread.wait()或者Thread.sleep()。替代的方法是:主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。

IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作,如保存设定或注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,但也不是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。

一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值,下面总结了一些技巧来避免ANR,并有助于让你的应用程序看起来有响应性。

如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。

当然我最常用的是用AsyncTask这个专用的异步处理类。

更多相关文章

  1. Android开发之旅:进程与线程
  2. 《老罗的Android之旅》导读PPT
  3. Android使用OkHttp访问网络——理解回调机制
  4. 论文翻译——DREBIN : Effective and Explainable Detection of
  5. Mono for Android, C# for Android,Monodroid初尝鲜-[Hello, Mono
  6. Android应用程序级全局变量Application
  7. A​n​d​r​o​i​d​ ​B​l​u​e​t​o​o​t​h​详​解(And
  8. Android的Message机制(简单小结)
  9. 自己在使用Android(安卓)Maps API 开发地图应用程序时遇到的问题

随机推荐

  1. K8S进阶实践 之 Helm管理业务应用
  2. mysql常用单词
  3. “蚂蚁呀嘿” 刷屏的背后:算法工程师带你
  4. MySQL系列-DML语句之select单表查询
  5. 如何在iPhone上使用“滑动键入”?
  6. SQL基础知识V2——SELECT
  7. phpdav-1.1使用教程
  8. 2021华为认证报名须知,Pearson VUE考试中
  9. 关于一个NBA球队连续夺冠的SQL查询问题,解
  10. 函数递归使用