昨天遇到這個問題就是從一個輸入流裏調用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一個bitmap報的錯。第一次調用都沒問題,第二次再次調用就會報上面那個內存溢出的問題。而且有的手機報有的手機不報。研究了半天終於解決。首先分析了下原因,應該是圖片佔用的內存超過了系統虛擬機可分配的最大限制。不同手機可能分配的最大值不一樣。後來找到解決辦法主要是設置BitmapFactory.Options。

 

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = 4;
bitmap = BitmapFactory.decodeStream(this.getContentResolver()..openInputStream(uri), null , bitmapOptions);
有的說要加上bitmapOptions.inJustDecodeBounds = true;但是我加上後得到的bitmap就為null。去掉之後就可以。按照上面的方法就解決問題了。最好把bitmap在不用的時候回收一下:


if (bitmap != null && !bitmap.isRecycled())

bitmap.recycle();

某位大神的圖片佔用內存的演算法:

介紹一下圖片佔用進程的內存演算法吧。
android中處理圖片的基礎類是Bitmap,顧名思義,就是位圖。佔用內存的演算法如下:
圖片的width*height*Config。
如果Config設置為ARGB_8888,那麼上面的Config就是4。一張480*320的圖片佔用的內存就是480*320*4 byte。
前面有人說了一下8M的概念,其實是在默認情況下android進程的內存佔用量為16M,因為Bitmap他除了java中持有數據外,底層C++的skia圖形庫還會持有一個SKBitmap對象,因此一般圖片佔用內存推薦大小應該不超過8M。這個可以調整,編譯源代碼時可以設置參數。

 

// Eliminate extra GCs during startup by setting the initial heap size to 4MB.
// TODO: We should restore the old heap size once the activity reaches the idle state
VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);


 

From:CSDN

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()