Crash
.閃退(Crash)是客戶端程序在運(yùn)行時(shí)遭遇無法處理的異?;蝈e(cuò)誤時(shí)而退出應(yīng)用程序的表現(xiàn),請從crash發(fā)生的原因分類與解決方法、
在出現(xiàn)crash后如何捕捉并分析異常這兩個(gè)問題給出自己的解決方案
原因分類
- 虛擬機(jī)Error:一些虛擬機(jī)無法處理而拋出的異常,比如常見的stackoverflow和oom
- RuntimeException:比如常見的NullPointException、ArrayIndexOutOfBoundException和ClassNotFoundException等
- 非運(yùn)行異常:比如FileNotFoundException
- Android特有屬性:比如使用主線程進(jìn)行耗時(shí)操作,比如網(wǎng)絡(luò)請求

image.png
解決方案
正確并有效地使用異常:
具體明確地拋出異常,而不是為了簡單拋出一個(gè)Exception;
提早拋出異常,比如在文件操作時(shí),需要對filename進(jìn)行檢查;
延遲捕獲,不要過早地吃掉異常使用Android進(jìn)程中的UnCaughtExceptionHandler(未捕獲異常處理器)對象
自定義一個(gè)UncaughtExceptionHandler對象,并設(shè)置為當(dāng)前進(jìn)程的UncaughtExceptionHandler對象,重寫UncaughtExceptionHandler
方法來在閃退前獲取導(dǎo)致閃退異常的詳細(xì)信息。使用第三方解決方案:比如Bugly、ACRA等。
OOM
APP發(fā)生OOM的原因以及如何避免
1.內(nèi)存壓力過大
- 加載大量圖片,導(dǎo)致內(nèi)存不足: 對圖片進(jìn)行壓縮,并采用軟引用方法
- 重復(fù)創(chuàng)建大量的view,比如listview的使用convertview和viewHolder
2.作用域不同,導(dǎo)致垃圾回收器無法回收
- 非靜態(tài)內(nèi)部類隱性持有外部類的引用
- context泄露:不要對Context-Activity長時(shí)間的引用(若要使用,必須保證和activity相同的生命周期);盡量用Application-Context;
3. 資源對象沒有關(guān)閉
- 常見的資源對象比如cursor, stream
- bitmap對象使用后不回收
- 調(diào)用registerReceiver后,銷毀活動時(shí)沒有調(diào)用un方法。
如何避免內(nèi)存泄露
- 使用緩存技術(shù),比如LruCache或DiskLruCache,對象重復(fù)并頻繁創(chuàng)建時(shí)使用對象池,比如Volley源碼中定義ByteArrayPool作為byte數(shù)組的緩存池
- 對于引用生命周期不同的對象,采用軟引用或弱引用
- 對于資源對象,一定要關(guān)閉
- 內(nèi)存壓力過大,就需要統(tǒng)一管理內(nèi)存