Android: проблемы с загрузкой изображений и преобразованием в растровые изображения - PullRequest
0 голосов
/ 16 июня 2010

Я работаю над приложением, которое загружает изображения с URL. Проблема в том, что только некоторые изображения загружаются правильно, а другие - нет. Прежде всего, вот код проблемы:

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 в качестве строкового аргумента, а затем загружает изображение, преобразует поток HttpResponse в растровое изображение с помощью метода BitmapFactory.decodeStream и возвращает его. Проблема в том, что, когда я нахожусь в медленном сетевом соединении (почти всегда 3G, а не Wi-Fi), некоторые изображения преобразуются в ноль - не все, только некоторые. Использование соединения Wi-Fi работает отлично; все изображения загружены и преобразованы должным образом.

Кто-нибудь знает, почему это происходит? Или лучше, как я могу это исправить? Как бы я даже пошел на тестирование, чтобы определить проблему? Любая помощь потрясающая; спасибо!

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Это известная проблема с декодером JPEG. Есть два решения. Либо вы загружаете все изображение в массиве byte [] с помощью ByteInputStream, а затем декодируете массив (это то, что я делаю в 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;
  }

}
0 голосов
/ 04 ноября 2010

Даже при подключении WiFi некоторые растровые изображения (в частности, .BMP) не будут декодироваться.Это просто глючный декодер, который не справляется с задержками.Если вы выполните поиск в стеке, вы найдете и другие решения, такие как упаковка потока HTTP в буферизованную сущность http.Это работает, но в зависимости от размера изображения может занимать много памяти.Для нашего коммерческого продукта мы закончили загрузку потока http на SDCard, а затем использовали Bitmapfactory в загруженном файле.Это несколько медленнее, но на 100% надежно.

...