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

Vid*_*nes 6 android http bitmap download

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

我有谷歌,并发现大多数开发人员使用HttpUrlConnection类下载jpeg以在ImageView中,在ListAdapter等内显示它.

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

现在,我使用此连接在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Rob*_*ert 1

内置浏览器比您的代码更快的原因有两个:

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