46

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);

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

これを入力していたので、自分でこれに答えただけだと思います...しかし、すぐにはわからなかったので、それでも投稿した方が便利だと思います。

4

2 に答える 2

101

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

とても正しい解釈です。

于 2010-04-26T11:32:28.843 に答える
7

AsyncTasks にはもう 1 つ問題があります。例にあることに注意してください

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

Android 3 以降 (API レベル 11、HONEYCOMB) url1で実行され、並行してダウンロードされurl4 ません。特に、コンタクトurl1がタイムアウトになると、タイムアウトになるまで転送がurl4開始されません。特に明示的に指定しない限り、すべての AsyncTask は同じ単一のワーカー スレッドによって処理されます。

ドキュメントは言う:

実行順序

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

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

于 2013-03-11T11:32:01.040 に答える