Crash
.閃退(Crash)是客戶端程序在運(yùn)行時(shí)遭遇無(wú)法處理的異常或錯(cuò)誤時(shí)而退出應(yīng)用程序的表現(xiàn)颈将,請(qǐng)從crash發(fā)生的原因分類與解決方法奔浅、
在出現(xiàn)crash后如何捕捉并分析異常這兩個(gè)問(wèn)題給出自己的解決方案
原因分類
- 虛擬機(jī)Error:一些虛擬機(jī)無(wú)法處理而拋出的異常画拾,比如常見(jiàn)的stackoverflow和oom
- RuntimeException:比如常見(jiàn)的NullPointException皿哨、ArrayIndexOutOfBoundException和ClassNotFoundException等
- 非運(yùn)行異常:比如FileNotFoundException
- Android特有屬性:比如使用主線程進(jìn)行耗時(shí)操作砰逻,比如網(wǎng)絡(luò)請(qǐng)求
解決方案
正確并有效地使用異常:
具體明確地拋出異常购公,而不是為了簡(jiǎn)單拋出一個(gè)Exception洲守;
提早拋出異常片酝,比如在文件操作時(shí)固耘,需要對(duì)filename進(jìn)行檢查葬毫;
延遲捕獲镇辉,不要過(guò)早地吃掉異常使用Android進(jìn)程中的UnCaughtExceptionHandler(未捕獲異常處理器)對(duì)象
自定義一個(gè)UncaughtExceptionHandler對(duì)象,并設(shè)置為當(dāng)前進(jìn)程的UncaughtExceptionHandler對(duì)象贴捡,重寫(xiě)UncaughtExceptionHandler
方法來(lái)在閃退前獲取導(dǎo)致閃退異常的詳細(xì)信息忽肛。使用第三方解決方案:比如Bugly、ACRA等烂斋。
OOM
APP發(fā)生OOM的原因以及如何避免
1.內(nèi)存壓力過(guò)大
- 加載大量圖片屹逛,導(dǎo)致內(nèi)存不足: 對(duì)圖片進(jìn)行壓縮,并采用軟引用方法
- 重復(fù)創(chuàng)建大量的view汛骂,比如listview的使用convertview和viewHolder
2.作用域不同罕模,導(dǎo)致垃圾回收器無(wú)法回收
- 非靜態(tài)內(nèi)部類隱性持有外部類的引用
- context泄露:不要對(duì)Context-Activity長(zhǎng)時(shí)間的引用(若要使用,必須保證和activity相同的生命周期)帘瞭;盡量用Application-Context淑掌;
3. 資源對(duì)象沒(méi)有關(guān)閉
- 常見(jiàn)的資源對(duì)象比如cursor, stream
- bitmap對(duì)象使用后不回收
- 調(diào)用registerReceiver后,銷毀活動(dòng)時(shí)沒(méi)有調(diào)用un方法蝶念。
如何避免內(nèi)存泄露
- 使用緩存技術(shù)抛腕,比如LruCache或DiskLruCache芋绸,對(duì)象重復(fù)并頻繁創(chuàng)建時(shí)使用對(duì)象池,比如Volley源碼中定義ByteArrayPool作為byte數(shù)組的緩存池
- 對(duì)于引用生命周期不同的對(duì)象担敌,采用軟引用或弱引用
- 對(duì)于資源對(duì)象摔敛,一定要關(guān)閉
- 內(nèi)存壓力過(guò)大,就需要統(tǒng)一管理內(nèi)存