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();