時々複数の画像をダウンロードする必要があるアプリを設計しています。ただし、ダウンロード要求を送信するたびに、複数のスレッドを生成するのではなく、単一のスレッドにキューイングする必要があります。
詳細な解決策を教えていただければ幸いです。ありがとう !
時々複数の画像をダウンロードする必要があるアプリを設計しています。ただし、ダウンロード要求を送信するたびに、複数のスレッドを生成するのではなく、単一のスレッドにキューイングする必要があります。
詳細な解決策を教えていただければ幸いです。ありがとう !
その方法を見ていきますExecutors.newFixedThreadPool()
。これはスレッドプールを作成します。スレッドプールは、関数で渡す大きな数と同じ数のスレッドのみを一度に実行します。1 を渡すと、一度に 1 つのスレッドのみが実行されるため、ダウンロードは順番に実行されますが、「別の」スレッドで実行されます。
このメソッドで作成した後は、そのメソッド内に/ExecutorService
を渡すだけで、それが実行されます。終わったら忘れずに。Runnable
Callable
submit()
shutdown()
独自のキューを作成して、すべての画像リクエストをそこに置くことができます。android AsyncTask を使用しますが、前のタスクが終了した後にのみ新しいタスクを開始します (トリッキーな方法)。
または、エグゼキューター サービスを作成してイメージを順次ダウンロードします (難しい方法で、車輪の再発明)。
または、android 用の github で ImageDownloader を見つけます。シングルスレッドのダウンロードをサポートするものがいくつかあります。こちらは人気です。(簡単な方法)
PS Android AsyncTask を順次実行できますが、API 11 以降でサポートされています。
Metova Android SDKには、 というクラスがありThreadPoolWorker
ます。とまったく同じように機能AsyncTask
しますが、オブジェクトをパラメーターとして受け取るコンストラクターがあり、ThreadPool
1 つのスレッドに制限できます。ThreadPool
オブジェクトはさまざまなオブジェクト間で再利用でき、ThreadPoolWorker
それぞれTheadPoolWorker
のdoInBackground
メソッドは基本的に開始された順序で実行されます。
簡単な例を次に示します。
private static final ThreadPool THREAD_POOL = new ThreadPool(1);
private void executeSomeWorkers() {
new MyThreadPoolWorker().execute("Jimmy");
new MyThreadPoolWorker().execute("Bobby");
new MyThreadPoolWorker().execute("Ronny");
}
private class MyThreadPoolWorker extends ThreadPoolWorker<String, Void, Object> {
public MyThreadPoolWorker() {
super(THREAD_POOL);
}
@Override
protected Object doInBackground(String... params) {
// Fun background stuff goes here!
}
}
アクティビティで設計している場合は、executor を使用してスレッドを処理し、それらを管理する AsyncTask を使用できます。サービスを使用している場合は、単一のスレッドでファイルを 1 つずつダウンロードするだけで、一定時間非アクティブになった後、またはエラーが発生した後にスレッドを中断して再起動します。