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

6
我需要知道:下载多张缩略图的最快方法是什么,比如说下载10张图片。似乎内置浏览器以非常聪明的方式完成了这个任务。
我已经使用Google搜索并发现大多数开发者使用HttpUrlConnection类来下载JPEG图片,并在ListAdapter等中显示它。
一些开发者通过使用DefaultHttpClient类实现下载,因为它对超时等有更好的支持。事实上,谷歌推荐使用Apache Http客户端,而不是本机Java HttpUrlConnection。尽管如此,这两种策略都可以正常工作,但与我自己的代码相比,它们非常慢。内置浏览器似乎比尝试使用自己的代码下载相同的位图快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;
    }
});

现在,我使用这个连接在循环中获取几个位图/缩略图:
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;
}

我创建了一个testpage.html页面,其中包含10个位图,并使用内置浏览器加载它。浏览器在1秒内呈现出所有缩略图。我确定它们没有被缓存在浏览器中,因为我每次刷新页面都会随机化这10个图像。
当我尝试创建一个简单的活动来下载并显示相同的缩略图时,速度要慢得多。
我希望Google Android团队能够注意到这一点,并将其包含在下一次开发者大会的视频演讲中。
他们应该定义一个最佳实践方法,因为似乎每个开发人员都试图用自己的方式解决这个“下载位图”的用例,而实际上我们都在试图做同样的事情。
我还测试了使用相同的DefaultHttpClient对象通过调用execute()并传入不同的url(HttpGet对象)来获取多个图像,但它仍远远不及内置浏览器的速度。我看到我的请求已经设置了连接保持标志,但似乎没有任何区别。
2个回答

1

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

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

几乎可以确定浏览器正在同时下载所有内容,而不是像帖子中的代码一样串行下载。两者都使用平台上相同的底层I/O;Java和WebKit中包装代码的差异肯定比移动网络延迟小得多。 - Sean Owen
不行 - 并发是主要原因 - 延迟 - 特别是对于移动网络设备,将主导任何传输。并行下载有效地通过 N-1 * RTT 减少了总传输时间。 - symcbean

1
我会使用线程同时下载多张图片。这应该有助于使您的代码与浏览器保持同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接