Можно ли сделать AsyncTask.doInBackground
синхронизировано - или добиться того же результата другим способом?
class SynchronizedTask extends AsyncTask {
@Override
protected synchronized Integer doInBackground(Object... params) {
// do something that needs to be completed
// before another doInBackground can be called
}
}
В моем случае любая AsyncTask.execute()
может быть запущена до завершения предыдущей, но мне нужно выполнить код в doInBackground
только после завершения предыдущей задачи. законченный.
РЕДАКТИРОВАТЬ: Как правильно указано, синхронизация работает только с одним и тем же экземпляром объекта.
К сожалению, невозможно создать AsyncTask
и вызвать execute()
более одного раза для одного и того же экземпляра объекта, как указано в разделе «Правила многопоточности» документа . Документация по AsyncTask
.
Решение состоит в том, чтобы использовать пользовательский Executorдля сериализации задач или, если вы используете API 11 или выше,AsyncTask.executeOnExecutor()
, как предлагается в комментариях ниже. .
Я опубликовал ответ, показывающий реализацию SerialExecutor
, которую можно использовать для постановки в очередь задач, которые будут выполняться последовательно.