Android中如何避免OOM
手機內存比較小,隨時可能發生溢出的狀況,因此避免內存泄露很是重要,不然程序二話不說直接崩潰。。下面的內容總結一下本身的經驗以及學習成果。有錯誤或者有補充的歡迎跟帖討論。
1.避免對activity的超過生命週期的引用。(儘可能使用application代替activity)。由於程序通常是由不少個Activity構成的,從一個Activity跳轉了之後,系統就有可能回收這個Activity的各類內存佔用。但是此時若是你的一些不可回收變量(好比靜態變量)保持了對此Activity對象的引用,那麼GC就不會對此Activity進行回收,無端佔用了大量的內存。這種狀況最好的辦法就是用application代替activity。用Context.getApplicationContext() 或者 Activity.getApplication()能夠很方便的獲得application對象。具體參考帖子
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=173353
2.有些不得不緩存在內存中的圖片大字符串等,最好使用軟引用或者弱引用。最經典的例子就是異步下載圖片,圖片會保存到一個HashMap中,下載一張就保存一張到HashMap中。此時hashmap中圖片愈來愈多內存就容易不夠用。軟引用很好的解決了這個問題。當系統內存不足時,會回收弱引用的內存。我在附件中給出了一個相關的很經典異步下載軟引用緩存的demo,你們能夠下載看看。注意修改程序中聯網的url。
3.請在調用位圖進行圖片處理(好比draw)後進行內存回收。bitmap.recycle();這樣會把剛剛用過的圖片佔用的內存釋放。這個不用解釋了,很簡單。
4.將圖片壓入內存獲得bitmap以前先利用BitmapFactory.Options的inSampleSize的值獲得壓縮圖片,這樣會省內存。好比inSampleSize=2,圖片將壓縮爲原圖的1/2,佔用內存也會變爲1/2,並且這樣的處理是在加載到內存以前進行的。這在處理很大圖片時是必須的。具體的代碼以下:
// 獲得壓縮過的圖片
public Bitmap getThumBitmapFromFile(String imageFile)
{
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true; // 只計算尺寸,不output
BitmapFactory.decodeFile(imageFile, opts); // 這步的decodeFile只是爲了獲得opts的原始尺寸
// opts.inSampleSize = computeSampleSize(opts, -1, 128 * 128);
// //計算合適的輸出尺寸(第三個參數是最大能接受的像素值)
opts.inSampleSize = getOptionsSampleSize(opts, 100, 200);
opts.inJustDecodeBounds = false; // output
try
{
Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts); // 這步decodeFile纔是真的output
return bmp;
}
catch (OutOfMemoryError err)
{
}
return null;
}
private int getOptionsSampleSize(BitmapFactory.Options options, int newWidth, int newHeight)
{
int radioWidth = (int) Math.ceil(options.outWidth / newWidth);
int radioHeight = (int) Math.ceil(options.outHeight / newHeight);
if (radioWidth > 1 || radioHeight > 1)
{
return radioWidth > radioHeight ? radioWidth : radioHeight;
}
else
{
return 1;
}
}
5.要像C程序員同樣去留意new出來的對象的生命週期,儘可能不要因爲各類複雜的引用致使GC不能及時的甚至永遠不能回收某塊內存。對象用完後請顯式設爲null更容易引發GC的注意並且還能夠養成注意對象生命週期的習慣,不是new出來就無論了而是要注意銷燬。還有就是有必要的時候調用一下System.gc()對GC作一下提醒。
本文引用自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=180008&extra=page%3D1&page=1
歡迎關注本站公眾號,獲取更多信息