Context相關(guān)內(nèi)存泄露問題

  1. 單例模式

在單例模式下如果需要獲取Context相關(guān)對象,由于會長期持有該對象,會導(dǎo)致相關(guān)對象無法被回收,從而引起內(nèi)存泄露問題,所以經(jīng)量通過該Context獲取ApplicationContext對象使用,由于ApplicationContext會存在整個app生命周期中,所以長期持有不會導(dǎo)致內(nèi)存泄露。

  1. 匿名內(nèi)部類使用問題

    通常在Activity中會創(chuàng)建Handler對象,執(zhí)行某些方法,而當(dāng)Activity被finish時,未被處理的方法會被保存10分鐘左右,從而導(dǎo)致Activity無法被銷毀。所以應(yīng)該創(chuàng)建一個靜態(tài)內(nèi)部類,通過WeakReference獲取相關(guān)引用,避免內(nèi)存泄露。

    還可以在onDestroy中調(diào)用handler的removeCallbacksAndMessages(null),刪除所有與該Handler對象相關(guān)的Runnable和Message

  2. 開發(fā)中需要注意的點以免內(nèi)存泄漏

    1. 不要讓生命周期長于Activity的對象持有到Activity的引用
    2. 盡量使用Application的Context而不是Activity的Context
    3. 盡量不要在Activity中使用非靜態(tài)內(nèi)部類,因為非靜態(tài)內(nèi)部類會隱式持有外部類實例的引用(具體可以查看細(xì)話Java:”失效”的private修飾符了解)。如果使用靜態(tài)內(nèi)部類,將外部實例引用作為弱引用持有。
    4. 垃圾回收不能解決內(nèi)存泄露,了解Android中垃圾回收機(jī)制
  3. 獲取context的方法,以及使用上context和applicationContext的區(qū)別

    1. View.getContext,返回當(dāng)前View對象的Context對象,通常是當(dāng)前正在展示的Activity對象。
    2. Activity.getApplicationContext,獲取當(dāng)前Activity所在的(應(yīng)用)進(jìn)程的Context對象,通常我們使用Context對象時,要優(yōu)先考慮這個全局的進(jìn)程Context。
    3. ContextWrapper.getBaseContext():用來獲取一個ContextWrapper進(jìn)行裝飾之前的Context,可以使用這個方法,這個方法在實際開發(fā)中使用并不多,也不建議使用。
    4. Activity.this 返回當(dāng)前的Activity實例,如果是UI控件需要使用Activity作為Context對象,但是默認(rèn)的Toast實際上使用ApplicationContext也可以。
Paste_Image.png

大家注意看到有一些NO上添加了一些數(shù)字,其實這些從能力上來說是YES,但是為什么說是NO呢?下面一個一個解釋:

 數(shù)字1:啟動Activity在這些類中是可以的,但是需要創(chuàng)建一個新的task。一般情況不推薦。

 數(shù)字2:在這些類中去layout inflate是合法的,但是會使用系統(tǒng)默認(rèn)的主題樣式,如果你自定義了某些樣式可能不會被使用。

 數(shù)字3:在receiver為null時允許,在4.2或以上的版本中,用于獲取黏性廣播的當(dāng)前值。(可以無視)

ContentProvider、BroadcastReceiver之所以在上述表格中,是因為在其內(nèi)部方法中都有一個context用于使用。

好了,這里我們看下表格,重點看Activity和Application,可以看到,和UI相關(guān)的方法基本都不建議或者不可使用 Application,并且,前三個操作基本不可能在Application中出現(xiàn)。實際上,只要把握住一點,凡是跟UI相關(guān)的,都應(yīng)該使用 Activity做為Context來處理;其他的一些操作,Service,Activity,Application等實例都可以,當(dāng)然了,注意 Context引用的持有,防止內(nèi)存泄漏。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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