Я уже некоторое время использую AsyncTask
в Android. Мне это нравится, потому что вы можете запускать асинхронно, в фоновом потоке, любую задачу, которую хотите (под задачей я подразумеваю блок кода).
Вначале каждый раз, когда задача должна выполняться асинхронно и/или в фоновом потоке, я объединял ее код в расширение AsyncTask
. Иногда мне нужно было связать несколько таких задач (одну в зависимости от результата другой) и вызвать следующую в AsyncTask.onPostExecute(T data)
(после завершения выполнения), но теперь я чувствую, что мой код загроможден таким большим количеством стандартного кода (скелет AsyncTask) и соединение последовательных задач.
Кроме того, мои AsyncTask иногда запускаются из другого AsyncTask, и Android может жаловаться. Например, если я хочу отобразить некоторые элементы до/после выполнения, это будет проблемой при вложении вызовов.
В частности, я ищу способ модульного выбора того, должна ли задача выполняться синхронно/асинхронно, последовательно/параллельно или вместе с другой. Мой выбор до сих пор заключался в том, чтобы иметь простой интерфейс Task
, ожидающий реализации execute(T data)
метода. Затем я могу связать один или несколько из них для последовательного или параллельного запуска, как определено в таких блоках, как этот:
public doMultipleActions() {
runTask(new MyFirstParallelTask(myFirstData)); // running asynchronously in parallel the first task
runTask(new MySecondParallelTask(mySecondData)); // running asynchronously in parallel the second task
runTask(new MyFirstSequentialTask(myThirdData, new MySecondSequentialTask(myFourthData, new DummyCallback()))); // running asynchronously sequentially the third and fourth tasks
}
то есть runTask(Task t)
запустит код Task.execute(T data)
в блок кода AsyncTask.doInBackground(T... data)
. Последовательные задачи также предполагают выполнение другой задачи в блоке кода AsyncTask.onPostExecute(T data)
.
Я просмотрел несколько похожих вопросов: Можно ли последовательно связать асинхронную задачу (начиная одну после завершения предыдущей асинхронной задачи), Цепочка AsyncTask в действии (обратный вызов?), Как избежать объединения нескольких Вызовы AsyncTask?, наиболее близкие к моей проблеме, но я не смог найти ничего полезного, хотя я не думаю, что я единственный, кто имеет дело с этим.
Есть ли лучший способ, ожидаемый способ или даже шаблон проектирования для модульного использования AsyncTask
в Android?
AsyncTask
, чем асинхронных задач). Я мог бы улучшить свой вопрос. Кроме того, выполнение нескольких задач внутри одногоAsyncTask
не равно множествуAsyncTask
, обычно несколькоAsyncTask
могут выполняться параллельно. 19.05.2015AsyncTask
. Я обновил свой ответ для этого. AsyncTask можно запустить последовательно или параллельно. Если вы стремитесь сделать именно это, тоAsyncTaskexecuteOnExecutor
подойдет. Есть предостережения относительно максимального количества AsycTask, которые могут выполняться одновременно, и различного поведения по умолчанию для разных API. На самом деле, если вы запускаете ICS, то по умолчанию он последовательный. Поэтому я бы использовал Future, если я ищу только результат, и AsyncTask, если хочу выполнять фоновую задачу и обновлять пользовательский интерфейс. 19.05.2015