web-dev-qa-db-ja.com

AsyncTaskスレッドルール-実際には1回だけ使用できますか?

AsyncTaskに関するドキュメント では、スレッド化に関連するルールとして次のようになります。

  • タスクは1回だけ実行できます(2回目の実行が試行されると、例外がスローされます)。

つまり、クラスを使用するたびに、クラスの新しいインスタンスを作成する必要があります。言い換えれば、それは次のように行われなければなりません:

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

または逆に、次のことはできません。

DownloadFilesTask dfTask = new DownloadFilesTask();
dfTask.execute(url1, url2, url3);
dfTask.execute(url4, url5, url6);

誰かがこれが正確な解釈であることを確認できますか?

これをタイプしているときに、ほとんど自分で答えただけだと思います...しかし、すぐにはわかりませんでしたので、それでも投稿しておくと便利だと思います。

46
stormin986

誰かがこれが正確な解釈であることを確認できますか?

それは非常に正確な解釈です。

101
CommonsWare

AsyncTasksにはもう1つの落とし穴があります。例では注意してください

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

Android 3+(APIレベル11、HONEYCOMB)url1およびurl4will not並行してダウンロードします。特に、url1への連絡がタイムアウトする場合、url4での転送はタイムアウトするまで開始されません。明示的に指定しない限りそれ以外の場合は、すべてのAsyncTasksが同じ単一のワーカースレッドによって処理されます。

ドキュメントによると:

実行順序

最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。 DONUT以降、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。 HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一のスレッドで実行されます。

本当に並列実行が必要な場合は、executeOnExecutor(Java.util.concurrent.Executor、Object [])withTHREAD_POOL_EXECUTORを呼び出すことができます。