【Android】Out Of Memory(OOM)常見錯誤可能發生點。

再上一篇文章中因為原始圖檔太大所造成的OOM讓我印象深刻
所以就新增了這篇文章~

Android開發過程中大家應該都很常做到圖形的處理
最常見的狀況下就是使用Bitmap來放圖片
一個不注意的狀況下就會看到紅色的error log....






為什麼會發生OOM的錯誤呢?(問一下我師父"谷哥"可以查到很多的文章)
在這邊就以我遇到的狀況來做個說明 
Android開發上的限制,在Android中記憶體有分兩種Dalvik Heap 和 Native Heap
而OOM造成的錯誤就是Native Heap超出了"限制"
所謂的限制的話早期的設備是16MB
後來的設備增加到24MB或32MB(依各家硬體設備)

這也是為我在上一篇提到的
硬體規格較新的設備上這個Crash是偶發性 
硬體規格較差的設備上Crash是100%會發生

在這個部分的話我們討論兩點
1.避免圖檔過大(或放到不對的資料夾中)
2.程式碼優化

第一點的話比較沒有甚麼好討論的(參照上一篇文章,換掉解析度過高就好)
比較有趣的事情是,解析度較高的圖檔放在不同的資料夾,占用的記憶體大寫也不同
圖片占用多少記憶體,這又是另外一個題外話了
有興趣可以參考此連結 ANDROID – BITMAP之佔用記憶體大小

第二點
使用BitmapFactory.decodeStream() 產生新的Bitmap
Bitmap myBitmap = BitmapFactory.decodeFile(圖片的來源);
重新set圖片的寬跟高
myBitmap = getResizedBitmap(myBitmap, 300, 300);  //重新設定圖片的寬跟高


























透過這種方式也可以減少內存的負擔
剩下的部分就是在程式中
onPause/onStop/onDestory 時,將沒用到的Bitmap做清除的動作
myBitmap.recycle();



沒有留言:

張貼留言