bitmap 內存溢出OOM的解決辦法分享


昨天遇到這個問題就是從一個輸入流里調用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);  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM