Хобрук: Ваш путь к мастерству в программировании

Дождитесь асинхронной задачи в асинхронной задаче в Android

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

Спасибо,


  • Пожалуйста, напишите какой-нибудь код, не совсем понятно, в чем проблема. 23.12.2015
  • Я думаю, мы можем использовать Thread.sleep(time) для этой цели. 23.12.2015
  • @NigamPatro, сон для этого непредсказуем и мало чем поможет. 23.12.2015
  • @saopayne Хорошо, я так и думал. 23.12.2015
  • У меня пока нет кода, просто думаю над решением этой проблемы. Я просто знаю, что мне придется ждать завершения асинхронного (из библиотеки), чтобы использовать результат. 23.12.2015
  • вы знаете об асинхронном методе onPreExecute() ?? 23.12.2015
  • Я не думаю, что есть способ ждать, так как оба asynchronous. первый, вероятно, финишировал бы первым, чем второй. 23.12.2015

Ответы:


1

Я думаю, что здесь вам следует определить интерфейс Listener, передать ссылку на объект, реализующий этот слушатель, вашему AsyncTask и вызвать метод этого объекта из вашего onPostExecute.

// this is your interface
// create it in its own file or as an inner class of your task
public interface OnTaskFinishListener {
    public void onTaskFinish();
}

// add the following code to your task's class
private OnTaskFinishListener mOnTaskFinishListener;
public void setOnTaskFinishListener(OnTaskFinishListener listener) {
    mOnTaskFinishListener = listener;
}

// in your onPostExecute method call this listener like this
// this will call the implemented method on the listener that you created
if (mOnTaskFinishListener != null) {
    mOnTaskFinishListener.onTaskFinish();
}

// suppose this is where you start your task
MyBackgroundTask task = new MyBackgroundTask();

// set new listener to your task - this listener will be called
// when onPostExecutes completed -> that's what you need
task.setOnTaskFinishListener(new OnTaskFinishListener() {
    @Override
    public void onTaskFinish() {
        // implement your code here
    }
});
task.execute(); // and start the task 
23.12.2015

2

Я бы предпочел не реализовывать стратегию ожидания. Оба AsyncTask могут совместно использовать Semaphore, который останавливает один, пока другой заканчивает

Инициируйте свой семафор

 private final Semaphore semaphore = new Semaphore(0);

Передайте этот объект обеим задачам

 public AsyncTask1(Semaphore semaphore){
     this.semaphore= semaphore;
 } 

 doInBackground(){
     //do something
     semaphore.acquire(); // <- Waiting till the other task finises
 }

И Задача2

 public AsyncTask2(Semaphore semaphore){
     this.semaphore= semaphore;
 } 

 onPostExecute(){
   //do something
   semaphore.release();
}
23.12.2015
  • Я долго искал это, спасибо большое. Но как вы думаете, есть ли побочные эффекты от использования семафоров в среде Android? 19.03.2019
  • О боже, этот ответ был очень давно. С семафорами вы используете немного низкоуровневых директив для обработки параллелизма. На сегодняшний день я бы рекомендовал для этой задачи использовать сопрограммы Kotlin или RxJava 2. 19.03.2019
  • Но как вы думаете, подходит ли RxJava2 для этой ситуации или нет, я имею в виду, где мы хотим остановить doInBackground(), чтобы дождаться завершения другой AsyncTask. 19.03.2019
  • Полностью. С RxJava вы можете обрабатывать несколько потоков данных. Читая вопрос еще раз, я не думаю, что понимаю вопрос, но я бы сказал, что zip оператор решает проблему 19.03.2019

  • 3

    Задание 1

       private final Callback callback;
       public AsyncTask1(Callback callback){
           this.callback = callback;
       } 
       doInBackground(){
           //do something
           while(!callback.isFinished()){
               Thread.sleep(WAIT_TIME);
           }
       }
    

    Задача2

       private final Callback callback;
       public AsyncTask2(Callback callback){
           this.callback = callback;
       } 
       onPostExecute(){
           //do something
           callback.setFinished(true);
       }
    
    class Callback{
        private volatile boolean finished = false;
        public void setFinished(boolean finished){
            this.finished = finished;
        }
    }
    
    23.12.2015
    Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..