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

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

Я обратился к Google и обнаружил, что большинство разработчиков используют класс HttpUrlConnection для загрузки jpeg-файла для его отображения в ImageView, внутри ListAdapter и т. Д.

Некоторые разработчики реализуют загрузку с помощью класса DefaultHttpClient, поскольку он лучше поддерживает тайм-ауты и т. Д. Фактически Google рекомендует использовать клиент Apache Http, а не собственный Java HttpUrlConnection. Тем не менее, обе упомянутые стратегии работают нормально, но они очень медленные по сравнению с тем, как в моем браузере HTC Desire загружает эскизы. Кажется, что встроенный браузер загружает изображения примерно в 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;
    }
});

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

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 поймет это и включит в одно из своих видео-выступлений на следующей конференции разработчиков.

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

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

6
задан Vidar Vestnes 15 December 2010 в 08:17
поделиться