android防止記憶體溢位淺析(一)

風的王子發表於2013-09-02
做android遊戲開發有一段時間了,對於開發中遇到額OutOfMemory 異常真的是很頭疼,今天就在此總結下。

遊戲開發中遇到的記憶體溢位基本上都是出現在載入Bitmap的時候 ,原因是Bitmap實在是太佔記憶體了,尤其是對於高解析度的的圖片一定要小心使用了。

下面就羅列出三點解決使用Bitmap時出現的記憶體溢位問題的方案:

一.及時的銷燬:

雖然,系統能夠確認Bitmap分配的記憶體最終會被銷燬,但是由於它佔用的記憶體過多,所以很可能會超過java堆的限制。因此,在用完Bitmap時,要及時的recycle掉。recycle並不能確定立即就會將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);

三、巧妙的運用軟引用(SoftRefrence)
有些時候,我們使用Bitmap後沒有保留對它的引用,因此就無法呼叫Recycle函式。這時候巧妙的運用軟引用,可以使Bitmap在記憶體快不足時得到有效的釋放。如下例:

private class MyAdapter extends BaseAdapter {  
 
     private ArrayList mBitmapRefs = new ArrayList();  
     private ArrayList mValues;  
     private Context mContext;  
     private LayoutInflater mInflater;  
 
     MyAdapter(Context context, ArrayList values) {  
         mContext = context;  
         mValues = values;  
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
     }  
     public int getCount() {  
         return mValues.size();  
     }  
 
     public Object getItem(int i) {  
         return mValues.get(i);  
     }  
 
     public long getItemId(int i) {  
         return i;  
     }  
 
     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;  
     }  
}

相關文章