Android以內存泄露

  內存泄露,簡稱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);  
相關文章
相關標籤/搜索