Можно ли последовательно соединить асинхронную задачу (начиная с одной после завершения предыдущей асинхронной задачи) - PullRequest
16 голосов
/ 21 сентября 2011

Каждый раз, когда я делаю httpRequest, экран будет заблокирован на несколько секунд во время выполнения кода.Следовательно, я использовал AsyncTask, чтобы сделать все мои httpRequest вещи в отдельном потоке, в то время как установил ProgressDialog, чтобы пользователь знал, что что-то происходит.

Недавно я столкнулся со следующей ситуацией: ввод одного из моих httpRequest зависит от результата предыдущего действия httpRequest (+ parse).Я не могу просто поместить эти два AsyncTask последовательно, потому что Android поместит их в два потока и запустит второй без завершения первого.И без соответствующего ввода (результат первого httpRequest) мой второй httpRequest приведет к сбою приложения.

Есть ли способ, которым я могу вставить wait(), чтобы заставить второй AsyncTask не запускаться, пока не закончится первый?

Ответы [ 6 ]

11 голосов
/ 21 сентября 2011

У меня тоже была такая же ситуация на днях. Я решил это следующим образом: Передайте ссылку вашей активности в конструктор асинхронного класса и выполните фоновую функцию do in. Теперь в функции post execute вызовите открытый метод вашей активности из асинхронного класса, чтобы снова выполнить задачу ... или попробуйте это:

            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();
            }

Приветствия

6 голосов
/ 21 сентября 2011

так что я думаю (не уверен), вам нужно вызвать второй asyncTask для метода после выполнения

protected void onPostExecute(final Void unused) {
            if (this.dialog.isShowing()) {
                this.dialog.dismiss();
                     new secTask().execute();
            }}
4 голосов
/ 24 августа 2012

Да, вы можете.Но это возможно только в 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's AsyncTask

Не вызывайте их такв вашем основном коде.Если вы это сделаете, то все они будут работать вместе:

// This is wrong
new Task1().execute();
new Task2().execute();
new Task3().execute();

Ссылка: AsyncTask

3 голосов
/ 05 февраля 2015

Как насчет использования 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);

    }
1 голос
/ 12 июля 2013

Наткнулся на эту тему, ища лучшее решение, чем то, что я сейчас использую, но все равно кажется лучшим ...

Что я делаю, так это передаю runnable в конструкторе каждой из моих асинхронных задач.

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

 if(doOnPostExec != null)
        doOnPostExec.run();

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

Мне просто не нравится делать все эти бегущие. Надеюсь, что что-то существовало, как в vb.net для цепочки делегатов.

0 голосов
/ 04 февраля 2017

Я сталкивался с этой проблемой раньше.Я использовал интерфейс класса обратного вызова и вызвал его метод внутри метода onPostExecute ().Таким образом, вы можете вызвать другой AsyncTask из метода обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...