ANR的定义: android
在android上,若是你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。所以,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。 数据库
如何避免: 网络
首先来研究下为何它会在android的应用程序里发生和如何最佳构建应用程序来避免ANR.
android应用程序一般是运行在一个单独的线程(例如:main)里,这就意味你的应用程序所作的事情若是在主线程里占用了大长时间的话,就会引起ANR对话框,由于你的应用程序并无给本身机会来处理输入事件或者Intent广播。 app
所以,运行在主线程里的任何访求都尽量少作事情。特别是,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,并有助于让你的应用程序看起来有响应性。 spa
若是你的应用程序为响应用户输入正在后台工做的话,能够显示工做的进度(ProgressBar和ProgressDialog对这种状况来讲颇有用)。特别是游戏,在子线程里作移动的计算。若是你的程序有一个耗时的初始化过程的话,考虑能够显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种状况下,你都应该显示正在进行的进度,以避免用户认为程序被冻结了。 线程
固然我最经常使用的是用AsyncTask这个专用的异步处理类。 设计