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 を 1 つずつ要求しているのに対し、Web ブラウザーは常に一度に複数のファイルにアクセスするためですよね。
では、どうすれば速くなるでしょうか?
についてHttpClient
は、インスタンスを再利用する必要があり、マルチスレッド環境でインスタンスを使用する方法がいくつかあることを読みました。
URLConnection
しかし、ファイルサイズと MIME タイプを提供する他のクラスでこれを行うにはどうすればよいでしょうか?
編集:
イメージはすべて同じホスト上にあるわけではありませんが、少数のサーバーのみに分散しています。たとえば、100 個のイメージが 5 つのホスト名に分散しています。
いくつかのスレッドを使用したり、ジョブを実行する複数の AsynTask を一度に実行したりできますか? リサイクルなど、気をつけていることはありますURLConnection
か?
複数のスレッドを使用してタスク リスト (100 個の画像ファイル) を共有し、後で結果 (MIME タイプとファイル サイズ) をマージする方法がよくわかりません。手伝ってくれますか?