Android HttpClient загружает много маленьких уменьшенных изображений - PullRequest
1 голос
/ 15 марта 2012

У меня есть GridView со многими элементами ImageView.Для каждого элемента я лениво загружаю уменьшенное изображение из WebService, используя HttpClient.Я создаю новый HttpClient для каждого загружаемого изображения.Миниатюры 2-4kB маленькие.Я заметил, что загрузка идет медленно, изображения загружаются по одному, и каждое из них загружается в 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;
}

Ответы [ 3 ]

1 голос
/ 13 августа 2012

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

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

Что плохого в том, что установлено несколько соединений?Это проектное требование?

0 голосов
/ 15 марта 2012

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

0 голосов
/ 15 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...