oom ?oom oom重要的事情說三遍。
為了避免oom 那么我們應該怎么做呢
根據我總結的,
1,要選擇合適的圖片規格(bitmap類型),即:
? ? ? ? ALPHA_8? 每個像素占用1byte內存
? ? ? ? ARGB_4444 每個像素占用2byte內存
? ? ? ? ARGB_8888 每個像素占用4byte內存 ?不設置的話默認這個。
? ? ? ? RGB_565 每個像素占用2byte內存
2,降低采樣率。BitmapFactory.Options 參數inSampleSize的使用,先把options.inJustDecodeBounds設為true,只是去讀取圖片的大小,在拿到圖片的大小之后和要顯示的大小做比較通過calculateInSampleSize()函數計算inSampleSize的具體值,得到值之后。options.inJustDecodeBounds設為false讀圖片資源。
3,復用內存。即,通過軟引用(內存不夠的時候才會回收掉),復用內存塊,不需要在重新給這個bitmap申請一塊新的內存,避免了一次內存的分配和回收,從而改善了運行效率。
當一個Bitmap從內存緩存中移除掉的時候,把這個Bitmap加入到復用的Set集合里面去。判斷是否有Bitmap可以復用的時候先去這個集合里面拿到Bitmap,然后按照復用圖片的規則(Android4.4以下的平臺,需要保證inBitmap和即將要得到decode的Bitmap的尺寸規格一致,Android4.4及其以上的平臺,只需要滿足inBitmap的尺寸大于要decode得到的Bitmap的尺寸規格即可)判斷是否可以復用。
4,及時回收。即,recycle。
5,壓縮圖片。compress。
6,盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,因為這些函數在完成decode后,最終都是通過java層的createBitmap來完成的,需要消耗更多內存,可以通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source。