Правило потоков AsyncTask - действительно ли оно может быть использовано только один раз? - PullRequest
46 голосов
/ 26 апреля 2010

В документации для 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);

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

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

Ответы [ 2 ]

101 голосов
/ 26 апреля 2010

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

Это очень точное толкование.

7 голосов
/ 11 марта 2013

Есть еще одна ошибка с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...