У меня есть GridView со многими элементами ImageView. Для каждого элемента я ленив загружать эскиз imahge из WebService с помощью HttpClient. Я создаю новый HttpClient для каждого загружаемого изображения. Миниатюры размером 2-4 КБ. Я заметил, что загрузка медленная, изображения загружаются 1 на 1, и каждый из них загружается за 1 с. Возможно ли ускорить процесс?
public Bitmap downloadPhoto( String url ) {
try {
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient client = new DefaultHttpClient(params);
HttpUriRequest request = new HttpGet(url);
if ( this.authToken != null ) {
request.setHeader(AUTH_TOKEN_NAME, authToken);
}
request.setHeader(USER_AGENT_PROPERTY, AGENT_NAME);
HttpResponse response = client.execute(request);
if ( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) {
// read the content
long contentLenght = response.getEntity().getContentLength();
BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(response.getEntity());
Bitmap image = BitmapFactory.decodeStream(bufferedHttpEntity.getContent());
Log.e(TAG, "Bitmap != null " + (image != null) );
return image;
} else {
Log.e(TAG, "HTTP ERROR while executing method: downloadImage: " + response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
Log.e(TAG, "Exception while executing method: downloadImage: " + e.getMessage());
return null;
}
return null;
}
Я бы рекомендовал использовать AndroidHttpClient, который имеет хорошие настройки по умолчанию, включая ThreadSafeClientConnManager и, таким образом, может быть разделен между потоками. Вы можете создать пользовательскую AsyncTask и передать клиента в c'tor.
Вам не нужно каждый раз воссоздавать клиента, что также требует времени - просто прислушайтесь к событиям жизненного цикла и при необходимости закройте/воссоздайте.
Что случилось с несколькими подключениями? Это требование дизайна?
Создайте загружаемую часть пользовательского класса, которая расширяет AsyncTask. Это позволит убедиться, что изображения загружены в качестве фонового потока.
См. Http://developer.android.com/reference/android/os/AsyncTask.html.
Используете ли вы один поток для загрузки изображений? Вы можете попробовать использовать ThreadPoolExecutor для использования фиксированного пула потоков для одновременной загрузки.