2

У меня есть три задачи async, и я хотел бы иметь возможность запускать их синхронно. Как я могу это сделать, не помещая их в onPostExecute друг друга? Извините, если это было охвачено, но я не могу найти правильные ключевые слова в Google или здесь.Как запускать задачи Async синхронно без цепочки цепочек после выполнения?

new parseZip().execute(); 
new loadContent().execute(); 
new playContent().execute(); 

Любая помощь будет оценена, или просто ссылку на волоске

Благодарности

+0

Ваше название и должность немного неясны. Вы хотите, чтобы они исполнялись серийно или параллельно? –

+0

Последовательно, извините, если неясно – Ben

+1

Это поведение по умолчанию, как и у Honeycomb. Проверьте раздел _Order of execution_ здесь: http://developer.android.com/reference/android/os/AsyncTask.html –

ответ

3

я хотел бы иметь возможность запускать их синхронно. Как я могу это сделать , не помещая их в onPostExecute eachother?

Создайте свои собственные темы для трех отдельных задач и синхронизируйте их для последовательного запуска. См. here. Автор этого слайда также написал книгу по многопоточности в Android.

См. Также пример Specifying the Code to Run on a Thread.

В качестве альтернативы, AsyncTask s запускаются серийно по умолчанию. Если бы я был вами, я бы просто положил их в onPostExecute() друг на друга. Что в этом плохого ?

+1

Честно говоря, я только что занимался этими цепными звонками некоторое время и думал, что они немного странные, и это была не лучшая практика, поэтому я думал, что просто приду и спрошу .. Было просто видно, решение, где бы оно стало яснее, я думаю, что если все это делают, это прекрасно .. – Ben

+0

ZygoteInit, это поведение по умолчанию, которое я только что узнал в разделе комментариев.извините за то, что тратили свое время, но по крайней мере вы тоже кое-чему научились: D – Ben

+1

Не нужно извиняться :) концепции программирования становятся ясными благодаря обсуждению, чтению и исполнению ... best –

1

Вы можете запросить статус AsyncTask с помощью getStatus(), чтобы проверить, закончилась ли задание, а затем запустить другую задачу, но это будет означать постоянную проверку состояния задачи wach, и это не очень хорошая идея. ,

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

Возможно, лучший подход может заключаться в создании нового AsyncTask, который выполняет всю работу, выполняемую каждой из задач тура (может потребоваться некоторое рефакторинг для работы в методах, чтобы избежать дублирования кода).

Из документации:

AsyncTask разработан, чтобы быть вспомогательным классом вокруг Thread и обработчика и не является общей основой потоковой.

Так, может быть, в вашем случае AsyncTask не является правильным инструментом, чтобы сделать работу, и вы должны думать об использовании простые темы, как @ZygoteInit предлагает.

+0

Привет Антонио, мне кто-то сказал, что если он выполняет большую обработку, как в моем playContent, и мне нужно многократно называть runOnUIThread, лучше использовать Async Task. – Ben

+0

Вы предлагаете с помощью getStatus вещь, которую я постоянно проверяю, если она изменилась? – Ben

+0

Вы правы. Я отредактировал причину, по которой я не предлагаю постоянно цикл, чтобы проверить, изменился ли статус (это не очень хорошая идея). Если вы хотите сохранить «AsyncTask» и воспользоваться преимуществами, не связывая их с помощью onPostExecute, лучшим подходом может быть интеграция doInBackground существующей задачи в новую. – antonio

Смежные вопросы