我有来自十几个来源的一堆图像,我正在后台线程下载它们.大多数图像都是在没有问题的情况下下载的,但有2个源会导致问题.他们的所有图像都无法加载.
我使用以下代码下载(和存储)图像:
file f=new file(cacheDir, urlHash);Bitmap bitmap=null;inputStream is=new URL(url).openStream();OutputStream os = new fileOutputStream(f);Utils.copyStream(is, os);os.close();bitmap = BitmapFactory.decodeStream(new fileinputStream(f), null, null);
Utils.copyStream:
public static voID copyStream(inputStream is, OutputStream os){ int counter = 0; final int buffer_size=1024; try { byte[] bytes=new byte[buffer_size]; for(;;) { int count=is.read(bytes, 0, buffer_size); if(count==-1) { Log.d("tag", counter + " bytes copIEd"); break; } os.write(bytes, 0, count); counter += count; } } catch(Exception ex) { ex.printstacktrace(); }}
当我尝试下载此图像http://www.zapakatel.cz/static/deal/7193-1057b.jpg而不是失败. BitmapFactory.decodeStream返回NulL.所有我能找到的可能导致问题的是is.bytesRemaining缺少几千字节:162721 vs 179845根据下载的文件大小.当我从该URL手动下载图像并将其上传到其他地方时,一切正常.
知道什么可能导致问题吗?托管此图像的服务器是否有可能在下载完成之前将我切断?这个图像在任何PC甚至在我的iPhone应用程序中加载都很好(我知道这是完全不同的平台,它可能并不重要,我只觉得它很奇怪)
解决方法:
我完全没有使用AndroID的经验,但这个问题似乎与响应的GZIP编码有关.
您指向的文件将返回并应用GZIP编码. 162721字节是编码数据的大小,179845是解码后的大小,您可以使用任何http检查器进行检查.看起来新的URL(url).openStream()不会自动解码GZIP编码的响应.
总结以上是内存溢出为你收集整理的java – InputStream.bytesRemaining小于应该全部内容,希望文章能够帮你解决java – InputStream.bytesRemaining小于应该所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)