Могу ли я последовательно переключать асинхронную задачу (начиная с одной после завершения предыдущей асинтезы)
Каждый раз, когда я делаю httpRequest
, экран будет заблокирован на несколько секунд во время выполнения кода. Поэтому я использовал AsyncTask
, чтобы делать все мои вещи httpRequest
в отдельном потоке, выставляя ProgressDialog
, чтобы пользователь знал, что что-то происходит.
Недавно я столкнулся со следующей ситуацией: вход одного из моих httpRequest
зависит от результата предыдущего действия httpRequest
(+ parse). Я не могу просто поместить два AsyncTask
последовательно, потому что Android поместит их в два потока и запустит второй, без завершения первого. И без соответствующего ввода (результат первого httpRequest
) мой второй httpRequest
приведет к сбою приложения.
Есть ли способ, по которому я могу вставить wait()
, чтобы второй AsyncTask
не запускался, пока не закончится первый?
Ответы
Ответ 1
У меня также была такая же ситуация на днях.
Я решил это так:
Передайте ссылку своей деятельности на конструктор класса async и выполните функцию do в фоновом режиме. Теперь в функции post execute вызовите общедоступный метод активности ur из класса async, чтобы снова выполнить задачу... или попробуйте следующее:
if (asynclass.getStatus() == android.os.AsyncTask.Status.PENDING) {
asynclass.execute();
} else if (RF.getStatus() == android.os.AsyncTask.Status.FINISHED) {
asynclass = new asyncclass();
asynclass.execute();
} else {
Toast.maketoast(this, "Plz wait", 1).show();
}
Приветствия
Ответ 2
поэтому я думаю (не уверен), вам нужно вызвать второй asyncTask для метода пост-выполнения
protected void onPostExecute(final Void unused) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
new secTask().execute();
}}
Ответ 3
Да, вы можете. Но это возможно только в onProgressUpdate()
или onPostExecute()
. Попробуйте сделать это следующим образом:
private class Task1 extends AsyncTask<Void, Void, Void> {
...
...
protected void onPostExecute(Void unused) {
dialog1.dismiss();
new Task2().execute();
}
}
Аналогично, вам нужно поместить new Task3().execute();
в метод onPostExecute()
Task2 AsyncTask
Не называйте их в своем основном коде. Если да, то все они будут работать вместе:
// This is wrong
new Task1().execute();
new Task2().execute();
new Task3().execute();
Ссылка: AsyncTask
Ответ 4
Как насчет использования метода executOnExecutor
:
public void runTasks() {
AsyncTask<Void,Void,Void> aTask = myTask();
AsyncTask<Void,Void,Integer> aTask1 = myTask1();
AsyncTask<Void,Void,Void> aTask2 = myTask2();
aTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
aTask1.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
aTask2.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
Ответ 5
Наткнулся на эту тему, ища лучшее решение, чем то, что я сейчас использую, но все равно кажется лучшим...
Что я делаю, это передать runnable в конструкторе каждой из моих задач async.
Как в post, так и в конце do в фоновом режиме, я запускаю свою следующую задачу, если у меня есть один, выполнив runnable.
if(doOnPostExec != null)
doOnPostExec.run();
Таким образом, я могу изменить порядок моих асинтаксов с помощью исполняемых файлов, которые я передаю, сохраняя код гибким, и, если я не пройду без запуска, они закончатся нормально. В runnables просто содержится одна строка, вызывающая следующую асинтезу.
Мне просто не нравится делать все эти runnables. Было надеяться, что что-то существовало, как в vb.net, для цепочки делегатов.
Ответ 6
Я столкнулся с этой проблемой раньше. То, что я сделал, это использовать интерфейс интерфейса обратного вызова и вызвать его метод внутри метода onPostExecute(). Таким образом вы можете вызвать другую AsyncTask из метода обратного вызова.