いつスレッドを使用し、いつ AsyncTask オプションを使用する必要がありますか?
のドキュメントにAsyncTask
よると:
AsyncTask は、Thread と Handler のヘルパー クラスとして設計されており、一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。 Executor、ThreadPoolExecutor、および FutureTask。
したがって、実行時間の長いタスクがある場合は、独自のフォークを作成するThread
か、ExecutorService
. 短いバックグラウンド タスクを実行している場合AsyncTask
は、この方法をお勧めします。
短時間のリクエスト用のスレッドを作成し、長時間のネットワーク操作で AsyncTask を拡張するクラスを作成するのは正しいアプローチですか?
いいえ、上記のドキュメントによると、逆になっています。
Thread を使用する場合、ネットワーク操作用の新しいクラスを実装する必要はありません。
と の両方で、新しいクラスを宣言AsyncTask
するThread
必要があります。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
...
}
}
...
// to start it
new DownloadFilesTask().execute(url1, url2, url3);
スレッドの使用方法は次のとおりです。
private class DownloadFilesTask implements Runnable {
// if you need to pass in args via the constructor
public DownloadFilesTask(URL... urls) {
...
}
public void run() {
// do stuff in the background
}
}
...
// to start it
new Thread(new DownloadFilesTask(url1, url2, url3)).start();
バックグラウンド タスクから結果を取得する必要がある場合は、代わりにCallable
とExecutorService
クラスを使用することもできます。
Callable を実行まで待機させる方法は?
AsyncTask
もサポートget()
します。