在 Android 应用程序中,我有一个图像 URL 列表,如下所示:
List<String> urls = new ArrayList<String>(100);
urls.add("http://www.example.org/1.jpg");
urls.add("http://www.example.org/2.png");
urls.add("http://www.example.org/3.jpg");
urls.add("http://www.example.org/4.jpg");
urls.add("http://www.example.org/5.png");
urls.add("http://www.example.org/6.png");
urls.add("http://www.example.org/7.png");
urls.add("http://www.example.org/8.jpg");
urls.add("http://www.example.org/9.jpg");
urls.add("http://www.example.org/10.gif");
...
urls.add("http://www.example.org/100.jpg");
现在我必须获取所有这些 URL 的文件大小和 MIME 类型,当然,这应该尽可能快地完成。
我所做的是以下内容:
for (String url : urls) {
int fileSize;
try {
URLConnection urlConnection;
urlConnection = new URL(url).openConnection();
urlConnection.connect();
final String mimeType = urlConnection.getContentType();
final int fileSize = urlConnection.getContentLength();
// do something with those two pieces of information
}
catch (MalformedURLException e) {
continue;
}
catch (IOException e) {
// some special handling
}
}
但这非常慢。这是因为它使用单个线程并一个一个地请求 URL,而 Web 浏览器总是一次访问多个文件,不是吗?
那么我怎样才能让它更快呢?
对于HttpClient
,我读到您应该重用实例,并且有一些方法可以在多线程环境中使用它们。
但是我将如何使用URLConnection
或任何其他为您提供文件大小和 MIME 类型的类来做到这一点?
编辑:
这些图像并不都在同一个主机上,而是分布在几个服务器上,比如分布在 5 个主机名上的 100 个图像。
您可以使用几个线程或一次运行多个 AsynTask 来完成这项工作吗?有没有什么需要注意的,比如回收URLConnection
物品之类的?
我不太确定如何使用多个线程来共享任务列表(100 个图像文件)并在之后合并结果(MIME 类型和文件大小)。你能帮我吗?