android HttpClient加载了许多小缩略图

时间:2012-03-15 15:38:57

标签: java android eclipse imageview httpclient

我有一个包含许多ImageView项目的GridView。对于每个项目,我懒惰使用HttpClient从WebService加载缩略图。我为我下载的每个图像创建了一个新的HttpClient。缩略图小到2-4kB。我注意到下载速度很慢,图像逐个加载,每个图像都以1s的速度下载。是否有可能加快这个过程?

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 个答案:

答案 0 :(得分:1)

我建议使用AndroidHttpClient,它有一些很好的默认设置,包括ThreadSafeClientConnManager,因此可以在线程之间共享。您可以创建自定义AsyncTask并在c&tor;中传递客户端。

您不应该每次都需要重新创建客户端,这也需要时间 - 只需监听生命周期事件并根据需要关闭/重新创建。

建立多个连接有什么问题?这是设计要求吗?

答案 1 :(得分:0)

制作扩展AsyncTask的自定义类的下载部分。这将确保图像作为后台线程下载。

参见: http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

您是否使用单线程下载图片?您可以尝试使用ThreadPoolExecutor使用固定的线程池进行同步下载。