android防止記憶體溢位淺析(一)
做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;
}
}
遊戲開發中遇到的記憶體溢位基本上都是出現在載入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;
}
}
相關文章
- android防止記憶體溢位淺析(二)Android記憶體溢位
- Android記憶體溢位分析Android記憶體溢位
- Java棧溢位|記憶體洩漏|記憶體溢位Java記憶體溢位
- 記憶體溢位記憶體溢位
- Java記憶體溢位Java記憶體溢位
- JBOSS記憶體溢位記憶體溢位
- 記憶體溢位:native溢位 和 上層溢位記憶體溢位
- Xamarin Android提示記憶體溢位錯誤Android記憶體溢位
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- 記憶體洩漏和記憶體溢位記憶體溢位
- WebLogic: 記憶體溢位Web記憶體溢位
- java 程式記憶體溢位Java記憶體溢位
- 記憶體溢位問題記憶體溢位
- 記憶體溢位的分析記憶體溢位
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- 來了解一下記憶體溢位和記憶體洩漏記憶體溢位
- Java記憶體溢位情況Java記憶體溢位
- 記憶體溢位的問題記憶體溢位
- Flume記憶體溢位錯誤記憶體溢位
- JNI練習-記憶體溢位記憶體溢位
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- iOS記憶體管理淺析iOS記憶體
- Android圖片記憶體溢位的解決方案Android記憶體溢位
- Android-Fragment 切換造成記憶體溢位,導致記憶體增長AndroidFragment記憶體溢位
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- 記憶體洩漏與記憶體溢位神比較記憶體溢位
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- 深入淺出JVM(十四)之記憶體溢位、洩漏與引用JVM記憶體溢位
- return new物件造成溢位記憶體物件記憶體
- JVM記憶體溢位及合理配置JVM記憶體溢位
- 傳說中的記憶體溢位記憶體溢位
- 解決記憶體溢位九法記憶體溢位
- mybatis-plus getOne 記憶體溢位MyBatis記憶體溢位
- 【Java】 記憶體分配全面淺析Java記憶體
- Java 記憶體模型 JMM 淺析Java記憶體模型
- 淺析JVM記憶體分割槽JVM記憶體
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位