在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
anr_ANR -ANR定义
ANR(Application Not Responding)定义
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
anr_ANR -如何来避免
考虑上面的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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为 应用程序被冻结了。
anr_ANR -标准大气参考
ANR (Atmosphere Normale de Reference)
标准大气参考,简称ANR,在1个标准大气压,温度20摄氏度,相对湿度为65%条件下,气体的流量。
ANR (Atmosphere Normale de Reference) is quantity of air at conditions 1.01325 bar absolute, 20oC and 65% RH (Relative Humidity).
anr_ANR -ANR技术
ANR(Automatic Network Replenishment Technology)
对视频监控来说,存储性能的重要性几乎与图像质量是一样的。传统DVR已经积累了不少先进的技术,如硬盘零碎片处理、硬盘轮休、异常断电保护等技术,为监控图像的可靠存储提供有力保障,NVR作为新一代网络监控产品,首先对DVR优秀的特性作了全面继承,其次它还借助网络化特性,进一步提升了存储的可靠性与灵活性,这其中最有意义的就是ANR技术的应用。我们知道,NVR的基础是网络,但网络承载业务的复杂性较高,导致了网络的不稳定,因此直接影响了承载于上的业务的稳定性。并且,这一点对于视频监控是绝对不容轻视的,因为可能由于网络的暂时性故障会直接导致重要视频录像的缺失,而录像资料之于视频监控的重要性绝对是首当其冲的。因此,网络不稳定导致录像资料的遗失这一点也一度成为NVR对峙DVR决战中最具致命性的隐患,但ANR技术的应用却使一切问题不复存在。
ANR,Automatic Network ReplenishmentTechnology,它是一种结合本地存储和网络存储的技术,ANR技术包括三个部分:一、侦测网络状况,即在网络失效时,能记录下失效前的传输数据,以待网络连结恢复后把数据转回到管理中心;二、双重录像,即当网络出现问题或不稳定时,管理中心和前端双方都会把图像数据单独存储在缓冲区以作备份;三、自动修复数据,即当网络恢复正常后,管理中心和前端双方会对比各自的数据,检查对比在网络失效时的图像数据,然后自动修复管理中心错误或遗失的数据。据此就可明白,具备ANR技术的NVR会在网络出现故障时自动启用前端存储,网络恢复后再将前端存储数据自动同步至NVR中心,并且是在不影响实时视频传输质量的前提下,从而实现了中心与前端的双存储备份,有效提升存储的可靠性与灵活性。
此外,针对一些对存储有着更高要求的场合,NVR还将提供另一项存储保障技术――RAID存储。虽然RAID的应用会导致用户使用成本的提高,但由于它的可靠性机制可以确保硬盘的有效合理使用、实现数据的冗余校验,使图像数据即使在部分存储介质损坏的情况下也不会丢失等重要性能,从而使得这一技术在对监控系统性能要求极高的高端行业市场一直受到重视,因此RAID技术的应用必然也会促进NVR对新市场的拓展,进一步加快取代DVR的进程。