Вопрос о порядке выполнения AsyncTasks
на Honeycomb+. Согласно документации Google:
При первом появлении AsyncTasks выполнялись последовательно в одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать распространенных ошибок приложений, вызванных параллельным выполнением.
Мой вопрос: будут ли AsyncTasks, которые последовательно выполняются в фоновом режиме, также выполняться в одном потоке?
Например, будет ли AsyncTask.SERIAL_EXECUTOR
, выполняющий задачи A, B и C, запустить задачу A в потоке 1, затем задачу B в потоке 1, затем задачу C в потоке 1?
Или возможно ли, что AsyncTask.SERIAL_EXECUTOR
выполнит задачу A в потоке 1, затем задачу B в потоке 2, затем задачу C в потоке 3? В этой схеме все задачи выполняются последовательно, но в разных фоновых потоках.
Я спрашиваю, потому что я добавил некоторый код отладки в свой doInBackground и вижу потоки с именами AsyncTask #5
, AsyncTask #4
, AsyncTask #2
и AsyncTask #3
, хотя я предполагал, что каждый раз буду видеть один поток с именем «AsyncTask Worker» или что-то в этом роде.
(Я просто хочу подтвердить свою собственную ментальную модель того, как должны работать AsyncTasks; я не сообщаю об ошибке или проблеме в этом вопросе.)
Спасибо!
AsyncTask
поддерживает свою собственную очередь и передает задачи в обычный пул многопоточных потоков (тот, который отображается какTHREAD_POOL_EXECUTOR
) по одной за раз. Следовательно, наблюдаемое вами поведение в высшей степени разумно. - person CommonsWare   schedule 27.01.2016