Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget(转)
昨天遇到這個(gè)問(wèn)題就是從一個(gè)輸入流里調(diào)用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一個(gè)bitmap報(bào)的錯(cuò)。第一次調(diào)用都沒(méi)問(wèn)題,第二次再次調(diào)用就會(huì)報(bào)上面那個(gè)內(nèi)存溢出的問(wèn)題。而且有的手機(jī)報(bào)有的手機(jī)不報(bào)。研究了半天終于解決。首先分析了下原因,應(yīng)該是圖片占用的內(nèi)存超過(guò)了系統(tǒng)虛擬機(jī)可分配的最大限制。不同手機(jī)可能分配的最大值不一樣。后來(lái)找到解決辦法主要是設(shè)置BitmapFactory.Options。
有的說(shuō)要加上bitmapOptions.inJustDecodeBounds = true;但是我加上后得到的bitmap就為null。去掉之后就可以。按照上面的方法就解決問(wèn)題了。最好把bitmap在不用的時(shí)候回收一下:
某位大神的圖片占用內(nèi)存的算法:
介紹一下圖片占用進(jìn)程的內(nèi)存算法吧。
android中處理圖片的基礎(chǔ)類(lèi)是Bitmap,顧名思義,就是位圖。占用內(nèi)存的算法如下:
圖片的width*height*Config。
如果Config設(shè)置為ARGB_8888,那么上面的Config就是4。一張480*320的圖片占用的內(nèi)存就是480*320*4 byte。
前面有人說(shuō)了一下8M的概念,其實(shí)是在默認(rèn)情況下android進(jìn)程的內(nèi)存占用量為16M,因?yàn)锽itmap他除了java中持有數(shù)據(jù)外,底層C++的skia圖形庫(kù)還會(huì)持有一個(gè)SKBitmap對(duì)象,因此一般圖片占用內(nèi)存推薦大小應(yīng)該不超過(guò)8M。這個(gè)可以調(diào)整,編譯源代碼時(shí)可以設(shè)置參數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/manmanlu/p/4837317.html
總結(jié)
以上是生活随笔為你收集整理的Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# OOP 重要部分全解
- 下一篇: Android RecyclerView