Android:下载图片和转换为位图时出现问题

时间:2010-06-16 01:53:01

标签: android networking bitmap

我正在开发一个从网址下载图片的应用程序。问题是只有一些图像被正确下载而其他图像没有被正确下载。 首先,这是问题代码:

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.decodeStream方法将HttpResponse流转换为位图,并返回它。问题在于,当我处于慢速网络连接(几乎总是3G而不是Wi-Fi)时,一些图像被转换为​​空 - 不是全部,而是只有部分图像。使用Wi-Fi连接可以很好地工作;所有图像都可以正确下载和转换。

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

2 个答案:

答案 0 :(得分:1)

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

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;
  }

}

答案 1 :(得分:0)

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