Мне нужно знать: каков самый быстрый способ загрузить несколько превью подряд, скажем, 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), но до скорости встроенного браузера все еще далеко. Я вижу, что в моих запросах установлен флаг поддержания активности соединения, но, похоже, это не имеет никакого значения.