2018年1月22日 星期一

[Android] ImageView Out Of Memory Error

問題:
我要用App載入一些Full HD(1920*1080)的圖,結果跑的時候閃退了,OutOfMemoryError (OOM),怎辦? 我的手機有4G RAM耶,為什麼記憶體會用完?

處理:Google 「ImageView Out Of Memory」

參考:DevAndroid-largeHeap知乎壹讀DevAndroid-largeBitmap簡書CSDN

說明:
如果因為OOM閃退,就是記憶體用完了,在Android記憶體給每隻App是有限的,不會用到全部的RAM。

而每支手機配給App的HeapSize不同,要看手機的/system/build.prop檔,有很多App可檢視這檔(但不要亂改較好);以4G手機來說,標準的Heap是256M、如果你用了android:largeHeap=true,會變成給512M,但Google跟大部分Dev都不推薦用這招解決OOM問題,還是減少Memory使用才是正途。

所以啦,用以下方法吧:

  1. 想自己寫的話,用ImageFactory載入Res裡的圖,而且縮成要用的大小,顏色不講究也可改不一定用ARGB8888,可以改用RGB565,載完的Bitmap再來給ImageView用,詳見Google教學
  2. 不排斥用第三方包的話,可以用Picasso(Square主導)、Glide(Google主導)、Fresco(FB主導) 其中一個,比較文可看簡書CSDN,講結論就是:一般App用Glide、大圖超多的用Fresco、不喜歡Google跟FB的用Picasso。當然這三個除了載大圖功能還有其他功能,包括反覆載入、從網載入、從檔載入、生命週期及錯誤防呆 等優化,就看有沒有用到囉~


沒有留言:

張貼留言