ANR與Crash


實際開發過程中,ANR和Crash經常會出現,如果要想辦法避免他們的出現,首先就要了解他們

ANR

ANR即(application not responding),即應用無響應,程序會彈出一個dialog提示用戶程序無響應,而這對於用戶體驗無疑是很不好的

至於程序為何會“無響應”,主要有以下幾個原因

1:InputDispatching (5 seconds) --主要類型

按鍵或觸摸等輸入事件在特定時間內無響應

2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定時間內無法處理完成

3:ServiceTimeout(20 seconds) --小概率類型

Service在特定的時間內無法處理完成

看起來好像略復雜,其實可以換個角度來理解,一般對於正常的APP而言,能造成長時間操作的主要就是耗時操作,大體上分為兩類,其一是網絡操作,其二是文件,數據庫的讀寫操作

如果耗時操作在UI線程,也就是主線程內進行操作,而且也確實“耗時”的情況下,就會造成UI線程的堵塞,也就造成了ANR

所以簡而言之,能夠解決ANR的辦法就是不在主線程內進行耗時操作

這里就提出了一個概念,異步

異步說的簡單些,就是多開線程,在其他線程內處理這些耗時操作,處理完畢之后,返回所需要的參數給主線程,主線程再做操作(所以之所以主線程又叫做UI線程,是因為我們應該只在主線程內處理UI操作)

異步的實現就說來話長了,從最開始的Thread+Handler,到后面的AsyncTask,再到Rxjaca,這里就不多做說明了

通過異步,我們可以讓UI線程不堵塞或者盡量低可能性的堵塞,這樣就極大避免了ANR的出現

Crash

crash,即崩潰,和ANR一樣,系統會彈出一個dialog提示用戶該應用已崩潰,同理,用戶體驗很糟糕

之所以會出crash,一句話概括,基本就是因為異常的出現

在程序中可能會出現你未捕獲到的異常,這就造成了崩潰,但是這種情況下即使出現了crash我們也應該換一種對用戶較為友好的方式來告知用戶

那么如何改掉crash的提示方式呢,比較原始的方法,附上任玉剛大神的一篇博文

Android程序Crash時的異常上報

當然了,這么久過去了,現在處理的方式也可以接入第三方的SDK來解決,遠的不說,騰訊的Bugly就是其中一種解決方案


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM