已經遇到了N次內存溢出的情況了,必須吸取教訓啊!
首先,bitmap常常是造成OOM的罪魁禍首!必須第一個解決:
bitmap 的作用域能小就盡量小,用完就趕緊recycle掉!不過我經常都是在ondestroy裡面才recycle~
//回收圖片資源
if(bitmaps != null && bitmaps.length > 0){
int length = bitmaps.length;
for(int i=0; i<length; i++){
if(bitmaps[i] != null && !bitmaps[i].isRecycled()){
bitmaps[i].recycle();
}
}
}
然後呢,就是如果用到ViewGroup的子類(比如ListView、GridView等)的話,就要移除它的ChildView,因為這玩意兒看著也很耗內存的樣子。。。
int listViewCount = dataList.size();
if(listView != null && (dataList != null && listViewCount>0)){
for(int i=0; i<listViewCount; i++){
dataList.removeAll(dataList);
adapter.notifyDataSetChanged();
}
}
listView = null;
dataList = null;
上面的兩段代碼我都是直接放onDestroy裡面執行的,效果還蠻好~ 至少不會崩~
----------------------------------分割線------------------------------------
當然,解決OOM的方法還有很多,比如WeakReference、壓縮bitmap圖像甚至直接修改Dalvik虛擬機分配內存的數量,- - ! 我就不一一說了,因為,,,我不會~ ╮(╯▽╰)╭ ~
WeakReference:
String abc=new String("abc");
WeakReference<String> abcWeakRef = new WeakReference<String>(abc);
abc=null;
System.out.println("before gc: "+abcWeakRef.get());
System.gc();
System.out.println("after gc: "+abcWeakRef.get());
壓縮bitmap:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(filepath,opts);
~~~Good Luck!