Android HttpClient загружает много маленьких уменьшенных изображений

1

У меня есть 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;
}
Теги:
httpclient
imageview

3 ответа

1
Лучший ответ

Я бы рекомендовал использовать AndroidHttpClient, который имеет хорошие настройки по умолчанию, включая ThreadSafeClientConnManager и, таким образом, может быть разделен между потоками. Вы можете создать пользовательскую AsyncTask и передать клиента в c'tor.

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

Что случилось с несколькими подключениями? Это требование дизайна?

0

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

См. Http://developer.android.com/reference/android/os/AsyncTask.html.

  • 0
    Это приведет к тому, что будет установлено несколько соединений с одним IP. Это нарушает «Правило ограничения двух соединений».
  • 0
    ThreadSafeHttpClientConnManager - лучшая ставка здесь. Следующая ссылка отвечает на дополнительные вопросы об этом stackoverflow.com/questions/1281219/…
0

Используете ли вы один поток для загрузки изображений? Вы можете попробовать использовать ThreadPoolExecutor для использования фиксированного пула потоков для одновременной загрузки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню