今天碰到了一个超级恶心的问题,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. 黄聪:Wordpress、PHP使用POST数据过大导致MySQL server has gone away报错原因分析

    错误原因: 当POST的数据超过 max_allowed_packet 就会报 MySQL server has gone away 的错误. 1.查看当前Mysql的 max_allowed_pac ...

  2. Top 6 Programming Languages for Mobile App Development

    Mobile application development industry in the last five years have multiplied in leaps and bounds, ...

  3. sparkStreaming与Kafka整合

    createStream那几个参数折腾了我好久..网上都是一带而过,最终才搞懂..关于sparkStreaming的还是太少,最终尝试成功... 首先启动zookeeper ./bin/zookeep ...

  4. win764上vs2010+opencv2.4.11安装配置

    1:准备工作 1)opencv的官网下载你所要版本的opencv库文件,运行安装解压到自定义的一个文件夹里(D:\Program Files). 2)安装vs2010. 二:配置 1.计算机环境变量: ...

  5. dede图片横向滚动

    <div id=demo style="overflow:hidden; width:960px;" > <table border=0 align=" ...

  6. DEV--GerdView控件

    1.遍历 ; i < gridView1.RowCount; i++) { ; j < gridView1.Columns.Count; j++) { object val = gridV ...

  7. Eclipse中构建Fluent风格到Formatter

    The place to set this is on the "Line Wrapping" tab of the code formatting preferences pag ...

  8. 使用SVN进行项目版本管理

    1.摘要 本文描述了利用SVN进行项目版本管理的方法,涉及项目版本号命名规则.SVN目录结构.第三方代码库的管理.版本创建.发布.修订.合并等行为的方法和原则. 2.版本号命名规则 版本号采用主版本号 ...

  9. Protobuf从安装到配置整理帖

    新做的Mini项目计划使用Google的Protobuf来做,关于Protobuf是什么玩意能干什么请自己去看这里:http://code.google.com/p/protobuf/ 这里讲一下安装 ...

  10. iOS开发之检查更新

    iOS设备检查更新版本: #pragma mark - 检查更新 - (void)checkUpdateWithAPPID:(NSString *)APPID { //获取当前应用版本号 NSDict ...