Правило 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); 

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

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

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

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

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

Существует еще одна версия с AsyncTasks. Обратите внимание, что в примере

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

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

Документы говорят:

Порядок исполнения

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

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