今天碰到了一个超级恶心的问题,BitmapFactory.decodeStream(bis,null,options)一直是返回NULL

问题是这样子的:

   InputStream is= response.body().byteStream();
Bitmap bm;
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true; BitmapFactory.decodeStream(is,null,options); int screenWidth=getActivity().getWindowManager().getDefaultDisplay().getWidth();
int screenHeight=getActivity().getWindowManager().getDefaultDisplay().getHeight(); int widthScale=options.outWidth/screenWidth;
int heightScale=options.outHeight/screenHeight; int scale=widthScale>heightScale?widthScale:heightScale;
options.inJustDecodeBounds=false;
options.inSampleSize=scale;
try {
bm=BitmapFactory.decodeStream(is,null,options);
image.setImageBitmap(bm);
is.close(); } catch (Exception e) {
e.printStackTrace();
}

第19行返回的位图始终为NULL,各种纠结百度(原谅我没有翻墙工具,吐槽下之前用的旗舰VPN,简直就是个黑店,买了一年的会员,居然特么倒闭了!!!)

发现因为之前的inputstream流已经被使用过了,导致指针往后移动,所以再次读取的时候就读不到数据了,

使用is.reset();就可以了,但是,这边还有个坑。。。。。。

一开始使用这个直接报IO异常了

后来发现,要想使用这个,首先,你的流 is.markSupported()必须返回true,

 InputStream is= response.body().byteStream();
BufferedInputStream bis=new BufferedInputStream(is);//用BufferedInputStream包装Inputstream
Bitmap bm;
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true; BitmapFactory.decodeStream(bis,null,options); int screenWidth=getActivity().getWindowManager().getDefaultDisplay().getWidth();
int screenHeight=getActivity().getWindowManager().getDefaultDisplay().getHeight(); int widthScale=options.outWidth/screenWidth;
int heightScale=options.outHeight/screenHeight; int scale=widthScale>heightScale?widthScale:heightScale;
options.inJustDecodeBounds=false;
options.inSampleSize=scale;
try {
bis.reset();//重置
bm=BitmapFactory.decodeStream(bis,null,options);
image.setImageBitmap(bm);
is.close(); } catch (Exception e) {
e.printStackTrace();
}

说是还有其他的解决办法,将inputstream解析成字节数组,使用decodeByteArray来解析,我试了下貌似也没用。。。。。

更新:

用上面的方法,会有一个比较坑的情况,请求图片过多,发现reset()报错,catch住之后就显示不了图片了。

然后还是用decodeByteArray吧。。。。

将inputStream转成 byte[]

    private  byte[] getByteArrayFromInputStream(InputStream is){
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
try {
while ((len=is.read(buffer))!=-1){
bos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bos.toByteArray(); }

两次decode均使用decodeByteArray(),搞定!!!!弄死人的节奏啊。。。。。

 

关于BitmapFactory解析流的问题a的更多相关文章

  1. 11_Android中HttpClient的应用,读取网络xml及xml解析流,Handler的应用,LayoutInflater的使用,SmartImageView的使用

     1 所需的web项目结构如下: 2 new.xml的文件内容如下: <?xml version="1.0" encoding="UTF-8" ?&g ...

  2. httpClient 发送请求后解析流重用的问题(HttpEntity的重用:BufferedHttpEntity)

    使用场景: 项目中使用httpClient发送一次http请求,以流的方式处理返回结果,开始发现返回的流只能使用一次,再次使用就会出错,后来看了一些解决方案,EntityUtils.consume(r ...

  3. 解析流中的Xml文件时,报错:java.net.MalformedURLException: no protocol

    原来的代码: // 创建DocumentBuilder对象 DocumentBuilder b = a.newDocumentBuilder(); // 通过DocumentBuilder对象的par ...

  4. Android Bitmap和Drawable互转及使用BitmapFactory解析图片流

    一.Bitmap转Drawable Bitmap bmp=xxx; BitmapDrawable bd=new BitmapDrawable(bmp); 因为BtimapDrawable是Drawab ...

  5. PS流的格式和解析总结

    对于PS流,最近因为工作需要,所以MPEG2中的PS流格式和解包过程进行了学习. 首先我们需要知道PS包流格式是怎么样的: (来自http://blog.csdn.net/chen495810242/ ...

  6. PS 流格式解析(转)

    对于PS流,最近因为工作需要,所以MPEG2中的PS流格式和解包过程进行了学习. 首先我们需要知道PS包流格式是怎么样的: 针对H264 做如下PS 封装:每个IDR NALU 前一般都会包含SPS. ...

  7. ffmpeg解析TS流

    介绍:  MPEG的系统层编码为不同的应用场景设计了两种格式:  TS(Transport Stream) 和PS(Program Stream), 它们两者之间不具有层级关系, 在逻辑上,它们两者都 ...

  8. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  9. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. android实现 服务器功能

    package com.weijia.tests; import java.io.IOException; import java.net.InetSocketAddress; import java ...

  2. jquery实现点击页面其他地方隐藏指定元素

    代码实例如下: <!DOCTYPE html><html><head><meta charset=" utf-8"><meta ...

  3. 如何动态添加和删除一个div

    代码实例如下: <!DOCTYPE html><html><head><meta charset="utf-8"><meta ...

  4. Java多线程之简单的线程同步实例

    数据类: package Thread.MyCommon; public class Data { public int num = 0; public synchronized int getEve ...

  5. Mac 终端常用命令备忘

    Tab 补全 pwd 显示路径 一 .ls ls -lh   查看当前路径详细文件 ls ..     返回上级目录 ls -a   显示隐藏文件 ls -a -l 以详细列表显示 ls ../../ ...

  6. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  7. 轻量级的.Net ORM框架介绍

    轻量型 ORM 组件 FluentData 官网https://fluentdata.codeplex.com/ http://www.cnblogs.com/babietongtianta/p/43 ...

  8. 配置webstorm使用supervisor时出现 /usr/bin/env: node: 没有那个文件或目录 解决方法

    配置好supervisor路径后 出现了 启动时出现了 /usr/bin/env: node: 没有那个文件或目录 需要讲.nvm下的node链接到, /usr/bin/目录下 sudo ln -s ...

  9. 解决Ubuntu不能挂载ntfs格式硬盘

    以前都是自动可以挂在NTFS硬盘的,可是现在不能挂载了.搜了一下 这里有办法 http://forum.ubuntu.org.cn/viewtopic.php?t=313930 例如你是 Error ...

  10. IDEA的查询引用、调用关系图的功能

    Eclipse的"Call Hierarchy"可以查看一个Java方法或类成员变量的调用树(caller和callee两个方向),非常方便. 在IDEA中类似功能被划分到了三个命 ...