今天碰到了一个超级恶心的问题,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. TSP(旅行者问题)——动态规划详解(转)

    1.问题定义 TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短. 假设现在有四个城市,0,1,2,3,他们之间的代价如图一,可以存成 ...

  2. SQL语言的三个分类:DDL、DML、DCL

    DML:数据操纵语言,主要是完成数据的新增,修改,删除和查询的操作. DDL:数据定义语言,主要是用来创建或修改表.视图.存储过程以及用户等. DCL:数据控制语言,是用来设置或更改数据库用户或角色权 ...

  3. BIP_开发案例08_BI Publisher图表示例 饼状图/直方图/折线图(案例)

    2014-12-25 Created By BaoXinjian

  4. HTML 表单验证和事件

    1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...

  5. psutil模块安装指南(win与linux)

    1.windows下psutil模块安装: https://pypi.python.org/packages/3.4/p/psutil/ 下载符合版本的软件包下载,然后安装即可. 2.ubuntu下载 ...

  6. 项目中用到的logback列子

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender ...

  7. 【收藏用】--切勿转载JAVA 使用Dom4j 解析XML

    原帖地址 : http://blog.csdn.NET/yyywyr/article/details/38359049 解析XML的方式有很多,本文介绍使用dom4j解析xml. 1.环境准备 (1) ...

  8. 采访ServiceStack的项目领导Demis Bellot——第2部分(转)

    ServiceStack是一个开源的.支持.NET与Mono平台的REST Web Services框架.InfoQ有幸与Demis Bellot深入地讨论了这个项目.在这篇两部分报道的第2部分中,我 ...

  9. C++学习9 this指针详解

    this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址).通过 this,可以访问当前对象的成员变量和成员函数. 所谓当前对象,就是正在使用的对象,例如对于stu. ...

  10. [Flex] as3xls读取excel,修改保存单表(一)

    经过大神修改过的as3xls支持中文,并可以修改保存单一sheet,保存后原有的excel样式均会消失,目前仅能如此. <?xml version="1.0" encodin ...