內存泄露,簡稱OOM(OutOfMemory)。區別於Web開發、PC端程序開發,Android程序開發有一個很大的限制:設備資源有限。當Android應用程序處理較大內存資源如圖片、音樂、視頻等多媒體資源時,在資源數量過多、處理時間過久的狀況下,很容易耗盡設備資源,此時,內存泄露就發生了。函數
那麼,什麼樣的Android程序容易引發OOM呢?如下來自我開發Android應用程序的總結和網上收集的資料。優化
1.bitmap處理不當引發的OOMspa
Bitmap佔用資源大,很容易吃完內存,這也是內存溢出問題裏最爲常見的問題。code
爲了有效優化處理Bitmap帶給咱們的內存問題,咱們應當注意如下幾點。視頻
a.及時銷燬blog
用完Bitmap後,要及時recycle。recycle不能保證當即釋放Bitmap,但會給虛擬機一個暗示:"該圖片能夠釋放了"。生命週期
if(!bitmapObject.isRecycle()){ bitmapObject.recycle(); }
b.適時使用軟引用圖片
回收bitmap時調用recycle()方法,該方法只能在bitmap放棄全部引用的狀況下才能回收,不然會報使用已回收的bitmap的錯誤。然而咱們使用bitmap時,大多數時間是建立的局部變量,引用這些bitmap的控件倒是全局的,或者說有更長的生命週期,因此回收bitmap要在控件再也不引用該資源的狀況下調用recycle()方法,這也是常常調用recycle()方法不成功而放棄回收bitmap的緣由。另外,有些時候,咱們使用Bitmap後沒有保留對它的引用,所以就沒法調用Recycle函數。這時候巧妙的運用軟引用,可使Bitmap在內存快不足時獲得有效的釋放。 內存
private class MyAdapter extends BaseAdapter { private ArrayList> mBitmapRefs = new ArrayList>(); public View getView(int i, View view, ViewGroup viewGroup) { View newView = null; if(view != null) { newView = view; } else { newView =(View)mInflater.inflate(R.layout.image_view, false); } Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName); mBitmapRefs.add(new SoftReference(bitmap)); //此處加入ArrayList ((ImageView)newView).setImageBitmap(bitmap); return newView; } }
c.適時減少生成的bitmap佔用空間資源
當要顯示的區域很小,不必將整個圖片都加在出來,只須要加載一個縮小過的圖片,能夠設置適當的採樣率,就能夠有效減少佔用的內存。
private ImageView preview; BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//圖片寬高都爲原來的二分之一,即圖片爲原來的四分之一 Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);