APP開發(fā)實(shí)戰(zhàn)122-APP防止內(nèi)存泄露

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é)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容