Android Bitmap OutOfMemory 解决办法

      在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现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.及时回收内存

 if(bitmap != null && !bitmap.isRecycled()){ 
        // 回收并且置为null
        bitmap.recycle(); 
        bitmap = null; 
} 
System.gc();
在适当的地方使用上述代码,将暂时不需使用的的回收掉,当然system.gc不应该频繁调用,否则会使系统效率降低。


2.使用BitmapFactory.Options对图片进行压缩

 BitmapFactory.Options opts = new BitmapFactory.Options();  
			 opts.inSampleSize = n; 
			 
	         bitmap = BitmapFactory.decodeStream(fis, null, opts);

使用inSampleSize设置放缩比例,默认值为0,设置一个大于0的数便可对图片进行压缩。

 BitmapFactory.Options opts = new BitmapFactory.Options();

    // 设置inJustDecodeBounds为true

    opts.inJustDecodeBounds = true;

    // 使用decodeFile方法得到图片的宽和高

    BitmapFactory.decodeFile(path, opts);

使inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null,只会计算出options.outWidth和options.outHeight值,在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前,将opts.inJustDecodeBound设置回false就可以得到图片了。


3.代码优化

为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常停止运行,通常,在实例化Bitmap的代码中,对OutOfMemory异常进行捕获

<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部分做一些内存回收操作,或者是使用缓存图片等...

总是良好的编程风格和优质的代码结构是程序员的无上追求....

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值