我需要知道:什么是连续下载多个缩略图的最快方法,比方说 10 张图片。内置浏览器似乎以一种非常聪明的方式做到了这一点。
我用 Google 搜索发现大多数开发人员都使用 HttpUrlConnection 类来下载 jpeg 以在 ImageView、ListAdapter 等中显示它。
一些开发人员使用 DefaultHttpClient 类实现下载,因为它对超时等有更好的支持。事实上 Google recommends使用 Apache Http 客户端,而不是 native 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 张图像。
当我尝试做一个简单的 Activity 来下载和显示相同的拇指时,速度要慢得多。
我希望 Google Android 团队能注意到这一点,并将其包含在他们在下一次开发者大会上的视频演讲中。
他们应该为此定义一个最佳实践,因为似乎每个开发人员都试图以自己的方式解决这个“下载位图”用例,而实际上我们都在尝试做同样的事情。
我还测试了使用相同的 DefaultHttpClient 对象通过使用不同的 url(HttpGet 对象)调用 execute() 来获取多个图像,但它与内置浏览器的速度相去甚远。我看到我的请求已经设置了连接保持 Activity 标志,但它似乎没有任何区别。
最佳答案
内置浏览器比您的代码更快的原因有两个:
- 浏览器主要以原生代码(如WebKit)实现
- 同时执行多个下载(多线程)
关于Android:通过 http 加载多个位图/缩略图的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441081/