內(nèi)存泄漏在android開發(fā)中是非常常見的一個問題泌射,也是經(jīng)常被忽略的一個問題粘姜。直到我們看到下面這個錯誤,才開始關(guān)注這個問題熔酷。
java.lang.OutOfMemoryError: Failed to allocate a 4308492 byte allocation with 467872 free bytes and 456KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:988)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2580)
at android.content.res.Resources.loadDrawable(Resources.java:2487)
at android.content.res.Resources.getDrawable(Resources.java:814)
at android.content.res.Resources.getDrawable(Resources.java:767)
at com.nostra13.universalimageloader.core.DisplayImageOptions.getImageOnLoadi ng(DisplayImageOptions.java:134)
對于這個錯誤信息孤紧,我們首先想到的一般是“是不是哪一個圖片太大了!” 這個錯誤信息往往會給我們一種假象拒秘,我們會認(rèn)為是圖片處理的問題号显,如何我們從這個角度去找問題,就會陷入一個陷阱躺酒。其實如果我們發(fā)現(xiàn)OutOfMemoryError這個錯誤押蚤,那么十有八九是因為我們的程序中有內(nèi)存泄漏的情況。
在Android應(yīng)用中羹应,什么原因會引起內(nèi)存泄漏呢揽碘?
一般在android應(yīng)用中,內(nèi)存泄漏往往是因為Context對象使用不當(dāng)引起的园匹。每一個app中都有一個全局的Context(getApplicationContext()
)雳刺。每一個activity都是這個Context的子類,用于存儲和當(dāng)前acitivity相關(guān)的信息裸违,所以activity泄漏會引起內(nèi)存泄漏掖桦。我們可以通過Memory Monitor來查看應(yīng)用的內(nèi)存使用情況.
App往往會在內(nèi)存使用太多的時候Crash掉,那么如何可以避免內(nèi)存泄漏呢累颂?
如何可以避免內(nèi)存泄漏呢滞详?
避免在Activity或者Fragment中過多的傳遞Context對象
千萬不要創(chuàng)建或者保存Context和View為靜態(tài)變量(重要的事情要加粗)
記得在 onPause()/ onDestroy() 方法中解除一些監(jiān)聽事件(比如地圖定位結(jié)果監(jiān)聽凛俱,EventBus監(jiān)聽事件)紊馏,還有釋放一些引用的資源。
不要在Avitivity的AsyncTask或后臺線程中存放強(qiáng)引用蒲犬。因為你的Acitivity關(guān)閉時朱监,這些異步操作可能還在進(jìn)行,會持有這個acitivity原叮,導(dǎo)致內(nèi)存泄漏赫编。
盡量使用Context-application
getApplicationContext()
替換Activity的Context。盡量避免使用靜態(tài)內(nèi)部類奋隶,在里面存儲activity或者View會導(dǎo)致內(nèi)存泄漏擂送,如果非要存儲使用弱引用是個不錯的解決辦法。