bitmap设置图片尺寸缩小,避免内存溢出/OutOfMemoryError的优化方法
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
我們都知道Android的Dalvik VM為一個應用提供了大約16MB的內存,一般我們處理超過8MB的圖片將會出現(xiàn)OutOfMemoryError異常(內存溢出異常),報如下錯誤:
?
20155392-byte external allocation too large for this process.
VM won't let us allocate 20155392 bytes
?
Java.lang.OutOfMemoryError : bitmap size exceeds VM budget????
?
Java代碼??以上是第一次開始寫瀏覽圖片,只看到decodeByteArray方法就直接把從SD卡獲取圖片路徑轉換為byte[]然后再賦給Bitmap,原來還有一個直接從路徑獲取Bitmap的方法:
Java代碼??
但由于需要顯示的圖片太大,預覽圖片就提示內存溢出(但找到資料說處理超過8MB的圖片將會出現(xiàn)OutOfMemoryError異常,開始第一段話),不過我顯示的圖片為4M也出現(xiàn)
?
20155392-byte external allocation too large for this process.
VM won't let us allocate 20155392 bytes
?
可能是?20155392算出來大概19M的大少,可能超出了分配給程序的16M大少
?
我們解碼(預覽顯示)一個圖片為了防止內存不足的異常我們可以使用BitmapFactory.Options?的屬性解決,代碼如下:
?
1、通過路徑獲取圖片
Java代碼? ???
?
2、通過Uri取圖片
?
Java代碼? ?以上代碼可以優(yōu)化內存溢出,但它只是改變圖片大小,并不能徹底解決內存溢出。
?
?
?
以下是網上找到的資料:
★Android 還有一些性能優(yōu)化的方法:
●? 首先內存方面,可以參考 Android堆內存也可自己定義大小 和 優(yōu)化Dalvik虛擬機的堆內存分配?
●? 基礎類型上,因為Java沒有實際的指針,在敏感運算方面還是要借助NDK來完成。這點比較有意思的是Google推出NDK可能是幫助游戲開發(fā)人員,比如OpenGL ES的支持有明顯的改觀,本地代碼操作圖形界面是很必要的。?
●? 圖形對象優(yōu)化,這里要說的是Android上的Bitmap對象銷毀,可以借助recycle()方法顯示讓GC回收一個Bitmap對象,通常對一個不用的Bitmap可以使用下面的方式,如?
?●? 目前系統(tǒng)對動畫支持比較弱智對于常規(guī)應用的補間過渡效果可以,但是對于游戲而言一般的美工可能習慣了GIF方式的統(tǒng)一處理,目前 Android系統(tǒng)僅能預覽GIF的第一幀,可以借助J2ME中通過線程和自己寫解析器的方式來讀取GIF89格式的資源。?
● 對于大多數(shù)Android手機沒有過多的物理按鍵可能我們需要想象下了做好手勢識別 GestureDetector 和重力感應來實現(xiàn)操控。通常我們還要考慮誤操作問題的降噪處理。?
Android堆內存也可自己定義大小?
?? 對于一些大型Android項目或游戲來說在算法處理上沒有問題外,影響性能瓶頸的主要是Android自己內存管理機制問題,目前手機廠商對RAM都比較吝嗇,對于軟件的流暢性來說RAM對性能的影響十分敏感,除了上次Android開發(fā)網提到的 優(yōu)化Dalvik虛擬機的堆內存分配外,我們還可以強制定義自己軟件的對內存大小,我們使用Dalvik提供的dalvik.system.VMRuntime類來設置最小堆內存為例:?
?
當然對于內存吃緊來說還可以通過手動干涉GC去處理,我們將在下次提到具體應用。?
優(yōu)化Dalvik虛擬機的堆內存分配?
對于Android平臺來說,其托管層使用的Dalvik JavaVM從目前的表現(xiàn)來看還有很多地方可以優(yōu)化處理,比如我們在開發(fā)一些大型游戲或耗資源的應用中可能考慮手動干涉GC處理,使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程序堆內存的處理效率。當然具體原理我們可以參考開源工程,這里我們僅說下使用方法:??
在程序onCreate時就可以調用?
Java代碼? ??★android系統(tǒng)中讀取位圖Bitmap時.分給虛擬機中圖片的堆棧大小只有8M。所以不管是如何調用的圖片,太多太大虛擬機肯定會報那個錯誤。超出圖片內存預算那個錯誤.:java.lang.OutOfMemoryError: bitmap size exceeds VM budget?
遇到這個問題是因為沒有回收資源.
調用上面的代碼可以基本解決這個問題.但是千萬不要在view中的onDraw()中調用.因為onDraw()方法是系統(tǒng)循環(huán)調用.只要圖片打開,系統(tǒng)就不停的調用該方法.?
最好的解決方案是在自定義的View中添加一個init()初始化方法的頭部調用.或者在構造函數(shù)的頂部調用。
轉載于:https://my.oschina.net/kangchunhui/blog/73442
總結
以上是生活随笔為你收集整理的bitmap设置图片尺寸缩小,避免内存溢出/OutOfMemoryError的优化方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu递推公式水题
- 下一篇: 【Apache Mina2.0开发之二】