Android Bitmap OutOfMemory 解决办法
Android Bitmap OutOfMemory 解決辦法
置頂?2014年07月01日 14:41:22?閱讀數(shù):3072?標(biāo)簽:?OutOfMemoryBitmapandroid圖片優(yōu)化更多
個人分類:?異常問題和解決辦法
??????在Android應(yīng)用里,最耗費內(nèi)存的就是圖片資源。而且在Android系統(tǒng)中,讀取位圖Bitmap時,分給虛擬機(jī)中的圖片的堆棧大小只有8M,如果超出了,就會出現(xiàn)OutOfMemory異常
E/AndroidRuntime(? 697): java.lang.OutOfMemoryError
E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376)
E/AndroidRuntime(? 697): ?? ?at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406)
E/AndroidRuntime(? 697): ?? ?at com.example.imagetoshow2.ImageAdapter.createReflectedImages(ImageAdapter.java:66)
E/AndroidRuntime(? 697): ?? ?at com.example.imagetoshow2.ImageAdapter.getView(ImageAdapter.java:54)
E/AndroidRuntime(? 697): ?? ?at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
解決辦法:
1.及時回收內(nèi)存
?if(bitmap != null && !bitmap.isRecycled()){
// 回收并且置為null
bitmap.recycle();
bitmap = null;
}
System.gc();
在適當(dāng)?shù)牡胤绞褂蒙鲜龃a,將暫時不需使用的的回收掉,當(dāng)然system.gc不應(yīng)該頻繁調(diào)用,否則會使系統(tǒng)效率降低。
?
?
2.使用BitmapFactory.Options對圖片進(jìn)行壓縮
?
?BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = n;
bitmap = BitmapFactory.decodeStream(fis, null, opts);
使用inSampleSize設(shè)置放縮比例,默認(rèn)值為0,設(shè)置一個大于0的數(shù)便可對圖片進(jìn)行壓縮。
?
?
?BitmapFactory.Options opts = new BitmapFactory.Options();
// 設(shè)置inJustDecodeBounds為true
opts.inJustDecodeBounds = true;
// 使用decodeFile方法得到圖片的寬和高
BitmapFactory.decodeFile(path, opts);
使inJustDecodeBounds為true后,再使用decodeFile()等方法,并不會真正的分配空間,即解碼出來的Bitmap為null,只會計算出options.outWidth和options.outHeight值,在下次使用BitmapFactory的decodeFile()等方法實例化Bitmap對象前,將opts.inJustDecodeBound設(shè)置回false就可以得到圖片了。
?
3.代碼優(yōu)化
為了避免應(yīng)用在分配Bitmap內(nèi)存的時候出現(xiàn)OutOfMemory異常停止運行,通常,在實例化Bitmap的代碼中,對OutOfMemory異常進(jìn)行捕獲
?<span style="font-size:18px;"> <span style="font-size:18px;">Bitmap bitmap = null;
try {
// 實例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
//
}</span></span>
然后在Catch部分做一些內(nèi)存回收操作,或者是使用緩存圖片等...
總是良好的編程風(fēng)格和優(yōu)質(zhì)的代碼結(jié)構(gòu)是程序員的無上追求....
?
?
https://blog.csdn.net/tangnengwu/article/details/36185361
https://blog.csdn.net/zhuwentao2150/article/details/52097344
總結(jié)
以上是生活随笔為你收集整理的Android Bitmap OutOfMemory 解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux显示中文乱码(linux 显示
- 下一篇: android 画布控件,Android