30.3.2防止內(nèi)存泄露
1 使用Service時,盡量使用IntentService,這樣可以避免忘記關(guān)閉服務(wù)。
2 避免一個對象被比它生命周期長的對象持有或引用,這樣會導(dǎo)致該對象無法被釋放,內(nèi)存泄露。
如對一個Activity Context保持長生命周期的引用,即使這個Activity已經(jīng)被銷毀了,但相關(guān)內(nèi)存無法被釋放。
對于生命周期長的對象,可以使用ApplicationContext。
非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例容易造成內(nèi)存泄漏,這個靜態(tài)實(shí)例的生命周期超過了類本身:如Activity中的一些特殊Handler等,盡量使用靜態(tài)類和弱引用來處理。
3 避免代碼設(shè)計的錯誤造成內(nèi)存泄露,如循環(huán)引用:A持有B、B持有C、C又持有A。
4 BroadCastReceiver要記得注銷處理。
5在Activity的onDestroy方法中調(diào)用
handler.removeCallbacksAndMessages(null),取消所有消息的處理,將所有的Callbacks和Messages全部清除掉。
6 在查詢SQLite數(shù)據(jù)庫時,會返回一個Cursor,當(dāng)查詢完畢后,及時關(guān)閉。
7 I/O流操作完畢,讀寫結(jié)束,記得關(guān)閉。
8 線程不再需要繼續(xù)執(zhí)行的時候要記得及時關(guān)閉。
如在Activity中關(guān)聯(lián)了一個生命周期超過Activity的Thread,在退出Activity時切記結(jié)束線程;像HandlerThread的run方法是一個死循環(huán),它不會自己結(jié)束,線程的生命周期超過了Activity生命周期,必須手動在Activity的銷毀方法中調(diào)用thread.getLooper().quit()結(jié)束。