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