我有一个包含许多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;
}
答案 0 :(得分:1)
我建议使用AndroidHttpClient,它有一些很好的默认设置,包括ThreadSafeClientConnManager,因此可以在线程之间共享。您可以创建自定义AsyncTask并在c&tor;中传递客户端。
您不应该每次都需要重新创建客户端,这也需要时间 - 只需监听生命周期事件并根据需要关闭/重新创建。
建立多个连接有什么问题?这是设计要求吗?
答案 1 :(得分:0)
制作扩展AsyncTask的自定义类的下载部分。这将确保图像作为后台线程下载。
参见: http://developer.android.com/reference/android/os/AsyncTask.html
答案 2 :(得分:0)
您是否使用单线程下载图片?您可以尝试使用ThreadPoolExecutor使用固定的线程池进行同步下载。