2010-06-16 104 views
0

我正在研究从url下载图像的应用程序。问题是只有一些图像被正确下载,而另一些则没有。 首先,现在的问题是代码:Android:下载图像并转换为位图时出现问题

public Bitmap downloadImage(String url) { 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse response = null; 
    try { 
     response = client.execute(new HttpGet(url)); 
    } catch (ClientProtocolException cpe) { 
     Log.i(LOG_FILE, "client protocol exception"); 
     return null; 
    } catch (IOException ioe) { 
      Log.i(LOG_FILE, "IOE downloading image"); 
      return null; 
    } catch (Exception e) { 
      Log.i(LOG_FILE, "Other exception downloading image"); 
      return null; 
    } 

    // Convert images from stream to bitmap object 
    try { 
     Bitmap image = BitmapFactory.decodeStream(response.getEntity().getContent()); 
     if(image==null) 
      Log.i(LOG_FILE, "image conversion failed"); 
     return image; 
    } catch (Exception e) { 
     Log.i(LOG_FILE, "Other exception while converting image"); 
     return null; 
    } 
} 

所以我有什么是需要的URL作为一个字符串参数,然后下载图像的方法,由BitmapFactory的手段获取HttpResponse流转换为位图.decodeStream方法,并返回它。问题是,当我在慢速网络连接(几乎总是3G而不是Wi-Fi)时,一些图像被转换为​​空 - 不是全部,只有其中的一部分。使用Wi-Fi连接完美工作;所有的图像都被正确下载和转换。

有谁知道为什么会发生这种情况?或者更好,我该如何解决这个问题?我怎么会去测试以确定问题呢?任何帮助都很棒;谢谢!

回答

1

这是JPEG解码器的一个已知问题。有两种解决方案。无论您使用ByteInputStream然后解码阵列(这是我在code.google.com/p/shelves做的)另一个解决方案是创建一个包装的InputStream下载整个图像中的byte []数组如下图所示:

public class PatchInputStream extends FilterInputStream { 

    public PatchInputStream(InputStream in) { 
    super(in); 
    } 

    public long skip(long n) throws IOException { 
    long m = 0L; 
    while (m < n) { 
     long _m = in.skip(n-m); 
     if (_m == 0L) break; 
     m += _m; 
    } 
    return m; 
    } 

} 
+0

什么是m和n是什么?我在理解代码示例时遇到了一些问题,也许一些更长的变量名会有所帮助,也许会有一两个评论。此外,您是否有链接到这个问题上的错误请求,或者这是一个普遍的问题,在未来版本的JPEG解码器无法解决? – Janusz 2010-06-16 08:28:33

+0

非常感谢罗曼·盖伊!没有你的帮助,我永远都不会想到这件事。 对于遇到此问题的其他人,Romain Guy提到的第一个解决方案可以在他的这一课程中找到:http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/组织/ curiouscreature /安卓/货架/ UTIL/ImageUtilities.java – Mike 2010-06-16 21:18:37

0

即使通过WiFi连接,一些位图(特别是.BMP)将不会被解码。这只是一个错误的解码器,不能处理延迟。如果您搜索stackoverflow,您会发现一些其他解决方案,例如将HTTP流包装在缓冲的http实体中。这可行,但取决于图像大小可能占用大量内存。对于我们的商业产品,我们最终将http流下载到sdcard,然后在dowloaded文件上使用Bitmapfactory。它有点慢但是100%可靠。