關於android使用大量Drawable發生OOM的解決方案


1.界面比較多,並且很多界面的背景圖片不一樣;

2.涉及到換膚功能,定義多種皮膚,皮膚的資源不是使用color 而是圖片資源;

以上兩種情況,如果不注意合理釋放內存,將會發生OOM。我們在android程序中,無論是使用layout布局設置了背景還是使用了setBackgroundResource 設置背景,在大屏幕手機上特別是在三星的大屏幕手機,爆oom的幾率更大。

網上很多例子都是使用以下方式去釋放內存:

    View view = findViewById(R.id.page_bg);
    BitmapDrawable bitmapDrawable = (BitmapDrawable) view.getBackground();
    view.setBackgroundResource(0);
    bitmapDrawable.setCallback(null);
    Bitmap bitmap = bitmapDrawable.getBitmap();
    if(bitmap != null && !bitmap.isRecycled()){
        bitmap.recycle();
        bitmap = null;
    }
    System.gc();    

然而使用該方法后卻存在另外一個潛在的致命問題:Canvas: trying to use a recycled bitmap(即使用了一個已經釋放的Bitmap來繪制界面)。

情況1:A界面中使用了a.png圖片,然后做了跳轉,finish了A界面,finish的時候,使用了以上代碼釋放了內存,然后再次進入A界面,極有可能出現該問題。

情況2:A界面中使用了a.png圖片,然后在B界面也使用了a.png, A界面沒有finish,B界面使用了finsh,並且使用上面同樣的方式釋放了內存。然后我們正常情況下,A界面會經歷onResume的方式來顯示,可是這個時候,我們的a.png在內存中已經釋放了,此時就會出現上面的錯誤。

解決方案:

無論你是在xml中布局使用了:android:background;還是在java代碼中調用了:setBackground(background);setBackgroundDrawable(background);setBackgroundResource(resid)的方式去設置了背景圖片。

使用的時候,請調用一下對應的方法:
setBackgroundResource和android:background→setBackgroundResource(0);

setBackgroundDrawable(background)→setBackgroundDrawable(null);

setBackground(background)→setBackground(null);

然后在onDestory中調用System.gc();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM