BitmapFactory的decodeStream()方法导致InputStream失效的问题

本文介绍了解决BitmapFactory的decodeStream()方法导致InputStream无法重复使用的问题。通过将输入流读入字节数组再进行解码,避免了mark/reset失效的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BitmapFactory的decodeStream()方法导致InputStream失效的问题

问题代码:

FileOutputStream fos =null;
InputStream is=null;
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
is = new BufferedInputStream(conn.getInputStream());
Log.e(“string”,is.toString());
Log.e(“mark”,is.markSupported()+”“);
//因为需要二次读流,这里做一下标记
is.mark(is.available());

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds=true;
//注:decodeStream会使Input读流的时候mark标记失效
Bitmap bitmap = BitmapFactory.decodeStream(is,null,opts);

ImageSize imageSize =getImageViewSize(imageView);
opts.inSampleSize=caculateInSampleSize(opts,imageSize.width,imageSize.height);

opts.inJustDecodeBounds=false;
is.reset();
bitmap = BitmapFactory.decodeStream(is,null,opts);

conn.disconnect();
return bitmap;

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;

解决办法:可以将流读入数组中,再从数组中读取。

代码如下:
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
if(conn.getResponseCode()!=200){
return null;
}
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
byte [] bytes = new byte[1024];
int temp=0;
//把流写入baos
while ((temp=is.read(bytes))!=-1){
baos.write(bytes,0,temp);
}
is.close();
baos.close();
//数据放到数组中
byte[] data = baos.toByteArray();
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length,opts);
// 注:decodeStream会使Input读流的时候mark标记失效
// Bitmap bitmap = BitmapFactory.decodeStream(is,null,opts);

        ImageSize imageSize =getImageViewSize(imageView);
        opts.inSampleSize=caculateInSampleSize(opts,imageSize.width,imageSize.height);

        opts.inJustDecodeBounds=false;
        bitmap = BitmapFactory.decodeByteArray(data,0,data.length,opts);

        conn.disconnect();
        return bitmap;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;

参考链接:http://www.xue163.com/2653/1/26535657_4.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值