Android: Какой самый быстрый способ загрузить несколько растровых изображений / превью через http? - PullRequest
6 голосов
/ 14 декабря 2010

Мне нужно знать: какой самый быстрый способ загрузить несколько больших пальцев подряд, скажем, 10 изображений.Кажется, что встроенный браузер делает это очень умным способом.

У меня есть Google'd, и я обнаружил, что большинство разработчиков используют класс HttpUrlConnection для загрузки jpeg, чтобы отобразить его в ImageView, внутриListAdapter и т. Д.

Некоторые разработчики реализуют загрузку, используя класс DefaultHttpClient, поскольку он обеспечивает лучшую поддержку тайм-аутов и т. Д. Фактически Google рекомендует использовать клиент Apache Http, а не нативный Java HttpUrlConnection,Тем не менее, обе упомянутые стратегии работают нормально, но они очень медленные по сравнению с тем, как встроенный браузер на моем HTC желает скачать эскизы.Встроенный браузер загружает изображения примерно в 5-10 раз быстрее, чем при попытке загрузить те же самые растровые изображения с моим собственным кодом.И да, я всегда выполняю загрузку / http в отдельном рабочем потоке (не в GUI-потоке).

Кто-нибудь знает, как встроенный браузер загружает большие пальцы, или, по крайней мере, что такоесамый быстрый способ загрузить несколько изображений с сервера?

Я пытался использовать этот код:

DefaultHttpClient client = new DefaultHttpClient();
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, SO_TIMEOUT);      
client.setParams(httpParameters);
client.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
    @Override
    public long getKeepAliveDuration(HttpResponse response, HttpContext context)
    {
        return 5000;
    }
});

Теперь я использую это соединение, чтобы получить несколько растровых изображений / превью для-loop:

public static Bitmap downloadBitmap(String url, DefaultHttpClient client){

  HttpResponse response = null;
  HttpGet get = new HttpGet(url);
  try {
      response = client.execute(get);
      return BitmapFactory.decodeStream(response.getEntity().getContent());
  } 
  catch (ClientProtocolException e1) {
      e1.printStackTrace();
  }
  catch (IllegalStateException e){
      e.printStackTrace();
  } 
  catch (IOException e1) {
      e1.printStackTrace();
  }

  return null;
}

Я создал testpage.html с 10 растровыми изображениями и загрузил его с помощью встроенного браузера.Браузер отображает страницу со всеми большими пальцами в течение 1 секунды.И я уверен, что они не кэшируются в браузере, так как я рандомизирую 10 изображений для каждого обновления страницы.

Когда я пытаюсь выполнить простое действие, которое загружает и отображает те же большие пальцы, это очень многопомедленнее.

Я надеюсь, что команда Google Android поймет это и включит в одно из своих видео выступлений на следующей конференции разработчиков.

Они должны определить лучшие практики дляэто, так как кажется, что каждый разработчик пытается решить этот вариант использования «download-bitmap» по-своему, когда мы все на самом деле пытаемся сделать то же самое.

Я также протестировал использование того же объекта DefaultHttpClient для извлечения нескольких изображений, вызывая execute () с различными URL-адресами (объекты HttpGet), но он все еще далек от скорости до встроенного браузера.Я вижу, что мои запросы были помечены флагом поддержания соединения, но, похоже, это не имеет значения.

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Я бы использовал темы для загрузки нескольких изображений одновременно. Это должно помочь поставить ваш код в один ряд с браузером.

1 голос
/ 14 декабря 2010

Существуют две причины, по которым встроенный браузер работает быстрее вашего кода:

  1. Браузер в основном реализован в собственном коде (например, WebKit)
  2. Выполнено несколько загрузокодновременно (несколько потоков)
...