Правило многопоточности 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);

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

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


person stormin986    schedule 26.04.2010    source источник


Ответы (2)


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

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

person CommonsWare    schedule 26.04.2010
comment
Читая старые вопросы SO, я нахожу этот чрезвычайно забавный ответ. Я смеялся, и это было много. - person davidcesarino; 25.11.2011

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

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

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

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

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

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

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

person 18446744073709551615    schedule 11.03.2013
comment
Однако обратите внимание, что вопрос совсем в другом — можно ли повторно использовать экземпляр AsyncTask. - person Vit Khudenko; 11.03.2013