Правило Threading AsyncTask. Может ли оно действительно использоваться только один раз?

В документации по AsyncTask он дает следующее, как правило, относящееся к потоковой передаче:

  • Задача может быть выполнена только один раз (при попытке выполнить второе выполнение будет выбрано исключение).

Все это означает, что вам нужно создавать новый экземпляр класса каждый раз, когда вы хотите его использовать, правильно? Другими словами, это должно быть сделано следующим образом:

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

Может ли кто-нибудь проверить, что это точная интерпретация?

Я понимаю, что я в значительной степени просто ответил на это сам, когда я печатал это... Но это было не сразу очевидно для меня, поэтому я думаю, что было бы полезно, если бы выложили его.

Ответ 1

Может кто-то проверить, что это точное Интерпретация?

Это очень точная интерпретация.

Ответ 2

Есть еще одна проблема с AsyncTasks. Обратите внимание, что в примере

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

выполнен на Android 3+ (уровень API 11, HONEYCOMB) url1 и url4 не будут загружаться параллельно. В частности, если контакт url1 истечет, переход на url4 не начнется, пока не истечет время ожидания. Если вы явно не укажете иное, все AsyncTasks обслуживаются одним и тем же рабочим потоком.

В документах говорится:

Порядок выполнения

При первом вводе AsyncTasks выполнялись последовательно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений, вызванных параллельным выполнением.

Если вам действительно нужно выполнить параллельное выполнение, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с THREAD_POOL_EXECUTOR.