今天碰到了一个超级恶心的问题,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. sealed修饰符

    sealed(C# 参考) 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承. class A {} s ...

  2. JMM & synchronized概述(转)

    根据Java语言规范中的说明,JVM系统中存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,对于所有的线程是共享的(相当于黑板,其他人都可以看到的).每个线程都有自己的工作 ...

  3. MyEclipse9中的不伤眼修改、FreeMarker插件、JQuery提示插件、全屏(FullScreen)插件的安装

    ============下载相关附件===================== http://files.cnblogs.com/fhtwins/eclipse-fullscreen_1.0.7.zi ...

  4. SecureCRT自动记录日志【记录键入的所有命令和打印的结果信息】

  5. ThreadPoolExecutor使用介绍

    private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L,TimeUnit.MILLISECONDS, new Lin ...

  6. Android 自定义ScrollView 支持惯性滑动,惯性回弹效果。支持上拉加载更多

    先讲下原理: ScrollView的子View 主要分为3部分:head头部,滚动内容,fooder底部 我们实现惯性滑动,以及回弹,都是靠超过head或者fooder 就重新滚动到  ,内容的顶部或 ...

  7. OAF_EO系列6 - Delete详解和实现(案例)

    2014-06-14 Created By BaoXinjian

  8. 深入理解Javascript

    http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 1.编写高质量JavaScript代码的基本要点 2.Javascript函数 ...

  9. SmtpClient 类

    1, SmtpClient 类 http://www.cnblogs.com/panlijiao/archive/2012/11/14/2773836.html

  10. nfs不能自动mount(转载)

    From:http://www.wenzizone.com/2009/08/14/nfs_can_not_automount_supplementary.html 手动挂载nfs没有问题,说明port ...