如何避免anr
ANR在Android上稱作應(yīng)用程序無響應(yīng)對話框,那么你對ANR了解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是anr的內(nèi)容,希望大家喜歡!
anr的定義
在Android上,如果你的應(yīng)用程序有一段時(shí)間響應(yīng)不夠靈敏,系統(tǒng)會(huì)向用戶顯示一個(gè)對話框,這個(gè)對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application Not Responding)對話框。用戶可以選擇“等待”而讓程序繼續(xù)運(yùn)行,也可以選擇“強(qiáng)制關(guān)閉”。所以一個(gè)流暢的合理的應(yīng)用程序中不能出現(xiàn)anr,而讓用戶每次都要處理這個(gè)對話框。因此,在程序里對響應(yīng)性能的設(shè)計(jì)很重要,這樣系統(tǒng)不會(huì)顯示ANR給用戶。默認(rèn)情況下,在android中Activity的最長執(zhí)行時(shí)間是5秒,BroadcastReceiver的最長執(zhí)行時(shí)間則是10秒。
anr的避免方法
考慮上面的ANR定義,讓我們來研究一下為什么它會(huì)在Android應(yīng)用程序里發(fā)生和如何最佳構(gòu)建應(yīng)用程序來避免ANR。
Android應(yīng)用程序通常是運(yùn)行在一個(gè)單獨(dú)的線程(例如,main)里。這意味著你的應(yīng)用程序所做的事情如果在主線程里占用了太長的時(shí)間的話,就會(huì)引發(fā)ANR對話框,因?yàn)槟愕膽?yīng)用程序并沒有給自己機(jī)會(huì)來處理輸入事件或者Intent廣播。
因此,運(yùn)行在主線程里的任何方法都盡可能少做事情。特別是,Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創(chuàng)建操作。潛在的耗時(shí)操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時(shí)的計(jì)算如改變位圖尺寸,應(yīng)該在子線程里(或者以數(shù)據(jù)庫操作為例,通過異步請求的方式)來完成。然而,不是說你的主線程阻塞在那里等待子線程的完成——也不是調(diào)用Thread.wait()或是Thread.sleep()。替代的方法是,主線程應(yīng)該為子線程提供一個(gè)Handler,以便完成時(shí)能夠提交給主線程。以這種方式設(shè)計(jì)你的應(yīng)用程序,將能保證你的主線程保持對輸入的響應(yīng)性并能避免由于5秒輸入事件的超時(shí)引發(fā)的ANR對話框。這種做法應(yīng)該在其它顯示UI的線程里效仿,因?yàn)樗鼈兌际芟嗤某瑫r(shí)影響。
IntentReceiver執(zhí)行時(shí)間的特殊限制意味著它應(yīng)該做:在后臺(tái)里做小的、瑣碎的工作如保存設(shè)定或者注冊一個(gè)Notification。和在主線程里調(diào)用的其它方法一樣,應(yīng)用程序應(yīng)該避免在BroadcastReceiver里做耗時(shí)的操作或計(jì)算。但不再是在子線程里做這些任務(wù)(因?yàn)锽roadcastReceiver的生命周期短),替代的是,如果響應(yīng)Intent廣播需要執(zhí)行一個(gè)耗時(shí)的動(dòng)作的話,應(yīng)用程序應(yīng)該啟動(dòng)一個(gè)Service。順便提及一句,你也應(yīng)該避免在Intent Receiver里啟動(dòng)一個(gè)Activity,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的畫面,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點(diǎn)。如果你的應(yīng)用程序在響應(yīng)Intent廣播時(shí)需要向用戶展示什么,你應(yīng)該使用Notification Manager來實(shí)現(xiàn)。
一般來說,在應(yīng)用程序里,100到200ms是用戶能感知阻滯的時(shí)間閾值。因此,這里有一些額外的技巧來避免ANR,并有助于讓你的應(yīng)用程序看起來有響應(yīng)性。
如果你的應(yīng)用程序?yàn)轫憫?yīng)用戶輸入正在后臺(tái)工作的話,可以顯示工作的進(jìn)度(ProgressBar和ProgressDialog對這種情況來說很有用)。
特別是游戲,在子線程里做移動(dòng)的計(jì)算。
如果你的應(yīng)用程序有一個(gè)耗時(shí)的初始化過程的話,考慮可以顯示一個(gè)Splash Screen或者快速顯示主畫面并異步來填充這些信息。在這兩種情況下,你都應(yīng)該顯示正在進(jìn)行的進(jìn)度,以免用戶認(rèn)為應(yīng)用程序被凍結(jié)了。
anr的技術(shù)
ANR(Automatic Network Replenishment Technology)
對視頻監(jiān)控來說,存儲(chǔ)性能的重要性幾乎與圖像質(zhì)量是一樣的。傳統(tǒng)DVR已經(jīng)積累了不少先進(jìn)的技術(shù),如硬盤零碎片處理、硬盤輪休、異常斷電保護(hù)等技術(shù),為監(jiān)控圖像的可靠存儲(chǔ)提供有力保障,NVR作為新一代網(wǎng)絡(luò)監(jiān)控產(chǎn)品,首先對DVR優(yōu)秀的特性作了全面繼承,其次它還借助網(wǎng)絡(luò)化特性,進(jìn)一步提升了存儲(chǔ)的可靠性與靈活性,這其中最有意義的就是ANR技術(shù)的應(yīng)用。我們知道,NVR的基礎(chǔ)是網(wǎng)絡(luò),但網(wǎng)絡(luò)承載業(yè)務(wù)的復(fù)雜性較高,導(dǎo)致了網(wǎng)絡(luò)的不穩(wěn)定,因此直接影響了承載于上的業(yè)務(wù)的穩(wěn)定性。并且,這一點(diǎn)對于視頻監(jiān)控是絕對不容輕視的,因?yàn)榭赡苡捎诰W(wǎng)絡(luò)的暫時(shí)性故障會(huì)直接導(dǎo)致重要視頻錄像的缺失,而錄像資料之于視頻監(jiān)控的重要性絕對是首當(dāng)其沖的。因此,網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致錄像資料的遺失這一點(diǎn)也一度成為NVR對峙DVR決戰(zhàn)中最具致命性的隱患,但ANR技術(shù)的應(yīng)用卻使一切問題不復(fù)存在。
ANR,Automatic Network Replenishment Technology,它是一種結(jié)合本地存儲(chǔ)和網(wǎng)絡(luò)存儲(chǔ)的技術(shù),ANR技術(shù)包括三個(gè)部分:一、偵測網(wǎng)絡(luò)狀況,即在網(wǎng)絡(luò)失效時(shí),能記錄下失效前的傳輸數(shù)據(jù),以待網(wǎng)絡(luò)連結(jié)恢復(fù)后把數(shù)據(jù)轉(zhuǎn)回到管理中心;二、雙重錄像,即當(dāng)網(wǎng)絡(luò)出現(xiàn)問題或不穩(wěn)定時(shí),管理中心和前端雙方都會(huì)把圖像數(shù)據(jù)單獨(dú)存儲(chǔ)在緩沖區(qū)以作備份;三、自動(dòng)修復(fù)數(shù)據(jù),即當(dāng)網(wǎng)絡(luò)恢復(fù)正常后,管理中心和前端雙方會(huì)對比各自的數(shù)據(jù),檢查對比在網(wǎng)絡(luò)失效時(shí)的圖像數(shù)據(jù),然后自動(dòng)修復(fù)管理中心錯(cuò)誤或遺失的數(shù)據(jù)。據(jù)此就可明白,具備ANR技術(shù)的NVR會(huì)在網(wǎng)絡(luò)出現(xiàn)故障時(shí)自動(dòng)啟用前端存儲(chǔ),網(wǎng)絡(luò)恢復(fù)后再將前端存儲(chǔ)數(shù)據(jù)自動(dòng)同步至NVR中心,并且是在不影響實(shí)時(shí)視頻傳輸質(zhì)量的前提下,從而實(shí)現(xiàn)了中心與前端的雙存儲(chǔ)備份,有效提升存儲(chǔ)的可靠性與靈活性。
此外,針對一些對存儲(chǔ)有著更高要求的場合,NVR還將提供另一項(xiàng)存儲(chǔ)保障技術(shù)——RAID存儲(chǔ)。雖然RAID的應(yīng)用會(huì)導(dǎo)致用戶使用成本的提高,但由于它的可靠性機(jī)制可以確保硬盤的有效合理使用、實(shí)現(xiàn)數(shù)據(jù)的冗余校驗(yàn),使圖像數(shù)據(jù)即使在部分存儲(chǔ)介質(zhì)損壞的情況下也不會(huì)丟失等重要性能,從而使得這一技術(shù)在對監(jiān)控系統(tǒng)性能要求極高的高端行業(yè)市場一直受到重視,因此RAID技術(shù)的應(yīng)用必然也會(huì)促進(jìn)NVR對新市場的拓展,進(jìn)一步加快取代DVR的進(jìn)程。
看過“如何避免anr”的人還看了: