oom ?oom oom重要的事情說三遍伶棒。
為了避免oom 那么我們應該怎么做呢
根據(jù)我總結(jié)的旺垒,
1,要選擇合適的圖片規(guī)格(bitmap類型)肤无,即:
? ? ? ? ALPHA_8? 每個像素占用1byte內(nèi)存
? ? ? ? ARGB_4444 每個像素占用2byte內(nèi)存
? ? ? ? ARGB_8888 每個像素占用4byte內(nèi)存 ?不設置的話默認這個先蒋。
? ? ? ? RGB_565 每個像素占用2byte內(nèi)存
2,降低采樣率宛渐。BitmapFactory.Options 參數(shù)inSampleSize的使用竞漾,先把options.inJustDecodeBounds設為true眯搭,只是去讀取圖片的大小,在拿到圖片的大小之后和要顯示的大小做比較通過calculateInSampleSize()函數(shù)計算inSampleSize的具體值业岁,得到值之后鳞仙。options.inJustDecodeBounds設為false讀圖片資源。
3笔时,復用內(nèi)存棍好。即,通過軟引用(內(nèi)存不夠的時候才會回收掉)允耿,復用內(nèi)存塊梳玫,不需要在重新給這個bitmap申請一塊新的內(nèi)存,避免了一次內(nèi)存的分配和回收,從而改善了運行效率右犹。
當一個Bitmap從內(nèi)存緩存中移除掉的時候提澎,把這個Bitmap加入到復用的Set集合里面去。判斷是否有Bitmap可以復用的時候先去這個集合里面拿到Bitmap念链,然后按照復用圖片的規(guī)則(Android4.4以下的平臺盼忌,需要保證inBitmap和即將要得到decode的Bitmap的尺寸規(guī)格一致,Android4.4及其以上的平臺掂墓,只需要滿足inBitmap的尺寸大于要decode得到的Bitmap的尺寸規(guī)格即可)判斷是否可以復用谦纱。
4,及時回收君编。即跨嘉,recycle。
5吃嘿,壓縮圖片祠乃。compress。
6兑燥,盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖亮瓷,因為這些函數(shù)在完成decode后,最終都是通過java層的createBitmap來完成的降瞳,需要消耗更多內(nèi)存嘱支,可以通過BitmapFactory.decodeStream方法,創(chuàng)建出一個bitmap挣饥,再將其設為ImageView的 source除师。