Android:通过http加载多个位图/拇指的最快方法是什么?

时间:2010-12-14 15:54:56

标签: android http download bitmap

我需要知道:连续下载几个拇指的最快方法是什么,比方说10张图片。看起来内置的浏览器以非常聪明的方式完成了这项工作。

我有Google'd并且发现大多数开发人员正在使用HttpUrlConnection类下载jpeg以在ImageView中,在ListAdapter等内部显示它。

一些开发人员使用DefaultHttpClient类实现下载,因为它更好地支持超时等。实际上Google recommends使用Apache Http客户端,而不是本机Java HttpUrlConnection。也就是说,两个提到的startegies工作正常,但与我的HTC浏览器中的构建需要下载缩略图相比,它们非常慢。内置浏览器似乎下载的图像速度比尝试使用我自己的代码下载相同的位图快5到10倍。是的,我总是在单独的工作线程(而不是GUI线程)上进行下载/ http工作。

有人知道内置浏览器如何下载拇指,或者至少从服务器下载多张图片的最快方法是什么?

我尝试过使用此代码:

DefaultHttpClient client = new DefaultHttpClient();
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, SO_TIMEOUT);      
client.setParams(httpParameters);
client.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
    @Override
    public long getKeepAliveDuration(HttpResponse response, HttpContext context)
    {
        return 5000;
    }
});

现在,我使用此连接在for循环中获取几个位图/拇指:

public static Bitmap downloadBitmap(String url, DefaultHttpClient client){

  HttpResponse response = null;
  HttpGet get = new HttpGet(url);
  try {
      response = client.execute(get);
      return BitmapFactory.decodeStream(response.getEntity().getContent());
  } 
  catch (ClientProtocolException e1) {
      e1.printStackTrace();
  }
  catch (IllegalStateException e){
      e.printStackTrace();
  } 
  catch (IOException e1) {
      e1.printStackTrace();
  }

  return null;
}

我创建了一个包含10位图的testpage.html,并使用内置浏览器加载它。浏览器在1秒内使用所有拇指呈现页面。而且我确定它们没有缓存在浏览器中,因为我为每次页面刷新随机化了10张图像。

当我尝试制作一个下载并显示相同拇指的简单活动时,它的速度要慢很多。

我希望谷歌Android团队能够在下一次开发者大会的视频讲话中将其包含在内。

他们应该为此定义最佳实践,因为似乎每个开发人员都试图以自己的方式解决这个“下载位图”用例,而实际上我们都试图做同样的事情。

我还测试了使用相同的DefaultHttpClient对象通过使用不同的url(HttpGet对象)调用execute()获取多个图像,但它仍然远离内置浏览器的速度。我看到我的请求已经连接了keep-alive标志,但它似乎没有任何区别。

2 个答案:

答案 0 :(得分:1)

内置浏览器的速度有两个原因:

  1. 浏览器主要以本机代码(例如WebKit)
  2. 实现
  3. 同时执行多个下载(多个线程)

答案 1 :(得分:1)

我会使用线程一次下载多个图像。这应该有助于使您的代码与浏览器相提并论。