實際開發過程中,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的提示方式呢,比較原始的方法,附上任玉剛大神的一篇博文
當然了,這么久過去了,現在處理的方式也可以接入第三方的SDK來解決,遠的不說,騰訊的Bugly就是其中一種解決方案