android釋放bitmap
『壹』 android bitmap 從網路獲取圖片並處理問題 溢出
在 java中,JavaVM擁有自動管理內存的功能,Java的GC能夠進行垃圾回收,但是如果ImageView使用過多的Bitmap的話,經常會報OOM(內存溢出)。
造成內存溢出及解決方案:
使用BitmapFactory.decodeStream替代createBitmap方法
原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。
使用壓縮讀取技術
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//計算出寬高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);
3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。
『貳』 Bitmap使用詳解
用到的圖片不僅僅包括.png、.gif、.9.png、.jpg和各種Drawable系對象,還包括點陣圖Bitmap
圖片的處理也經常是影響著一個程序的高效性和健壯性。
為什麼不直接用Bitmap傳輸?
點陣圖文件雖好,但是非壓縮格式,佔用較大存儲空間。
Bitmap主要方法有:獲取圖像寬高、釋放,判斷是否已釋放和是否可修改,壓縮、創建制定點陣圖等功能
用於從不同的數據源(如文件、輸入流、資源文件、位元組數組、文件描述符等)解析、創建Bitmap對象
允許我們定義圖片以何種方式如何讀到內存。
推薦閱讀: Android - Bitmap-內存分析
注意事項:
decodeFileDescriptor比decodeFile高效
查看源碼可以知道
替換成
建議採用decodeStream代替decodeResource。
因為BitmapFactory.decodeResource 載入的圖片可能會經過縮放,該縮放目前是放在 java 層做的,效率比較低,而且需要消耗 java 層的內存。因此,如果大量使用該介面載入圖片,容易導致OOM錯誤,BitmapFactory.decodeStream 不會對所載入的圖片進行縮放,相比之下佔用內存少,效率更高。
這兩個介面各有用處,如果對性能要求較高,則應該使用 decodeStream;如果對性能要求不高,且需要 Android 自帶的圖片自適應縮放功能,則可以使用 decodeResource。
推薦閱讀:[ BitmapFactory.decodeResource載入圖片縮小的原因及解決方法
canvas和Matrix可對Bitmap進行旋轉、放縮、平移、切錯等操作
可以用Bitmap.onCreateBitmap、Canvas的clipRect和clipPath等等方式
推薦閱讀: android自定義View學習4--圖像剪切與變換
對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲。如果發生了OutOfMemory異常,應用不會崩潰,而是得到了一個默認的Bitmap圖。
如果不進行緩存,盡管看到的是同一張圖片文件,但是使用BitmapFactory類的方法來實例化出來的Bitmap,是不同的Bitmap對象。緩存可以避免新建多個Bitmap對象,避免內存的浪費。
如果圖片像素過大,使用BitmapFactory類的方法實例化Bitmap的過程中,需要大於8M的內存空間,就必定會發生OutOfMemory異常。
可以將圖片縮小,以減少載入圖片過程中的內存的使用,避免異常發生。
推薦閱讀:
Bitmap詳解與Bitmap的內存優化