android bitmap 从网络获取图片并处理问题 溢出

为了防止内存溢出我做了如下操作
is = this.getInputStream(strUrl);
if (is != null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);
int scale = 1;
if (options.outHeight > IMAGE_MAX_SIZE|| options.outWidth > IMAGE_MAX_SIZE) {
scale = (int) Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE/ (double)Math.max(options.outHeight,options.outWidth))/ Math.log(0.5)));
}
System.out.println(scale);
options.inJustDecodeBounds = false;
options.inSampleSize = scale;
bitmap = BitmapFactory.decodeStream(is, null, options);
}
但是返回的怎么都是null
最新回答
红杏没墙⌒

2024-06-05 14:41:11

在 Java中,JavaVM拥有自动管理内存的功能,Java的GC能够进行垃圾回收,但是如果ImageView使用过多的Bitmap的话,经常会报OOM(内存溢出)。

造成内存溢出及解决方案:

  1. 使用BitmapFactory.decodeStream替代createBitmap方法

    原因是该方法直读取图片字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。

  2.  使用压缩读取技术

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

             BitmapFactory.decodeFile(imageSdUri, options);               

                  final int height = options.outHeight;

                  final int width = options.outWidth;

                  options.inSampleSize = 1;

                  int w = 320;

                  int h = 480;

                  h =  w*height/width;//计算出宽高等比率

                  int a = options.outWidth/ w;

                  int b = options.outHeight / h;

                  options.inSampleSize = Math.max(a, b);

                  options.inJustDecodeBounds = false;

                  Bitmap bitmap =  BitmapFactory.decodeFile(imageSdUri, options);


3.及时释放Bitamp
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。

人心可畏

2024-06-05 08:58:04

你一共读取了两次。
在第一次读取之后,即在调用方法”BitmapFactory.decodeStream(is, null, options)“之后,
is就已经空了,所以第二次会返回null。
解决方法:
用byte数组把读取的流先缓存起来,然后再使用方法”BitmapFactory.decodeByteArray()“进行解析。
消失在我眼中

2024-06-05 00:10:21

options.inJustDecodeBounds = false; 原因所在
追问
options.inJustDecodeBounds = false;不应该设为false吗?
不设返回null啊