2015-09-19 2 views
1

У меня есть две asyctask, которые вызываются одновременно, но мне нужны оба двух аусинхронных результата для обработки следующего шага.Дождитесь результата обеих двух задач asnyc

У меня есть одно решение: Учитывая переменные два члена для проверки состояния возврата две асинхронной задачи:

boolean b1 = false; 
boolean b2= false; 
Result r1 = null; 
Result r2 = null; 

callback1(
    done(Result r){ 
     b1 = true; 
     r1 = r; 
     asyncTwoFunction(b1,b2) 
} 
) 

callback2(
    done(Result r){ 
     b2 = true; 
     r2 = r; 
     asyncTwoFunction(b1,b2) 
} 
) 

asyncTwoFunction(b1,b2){ 
    if(b1 && b2){ 
     doSomeThing(r1,r2); 
     b1 = false; 
     b2 = false; 
    } 
} 

есть какой-то лучший способ сделать это? Спасибо

+0

asyncTwoFunction, должно ли оно выполняться асинхронно или предназначено для запуска в основном потоке? Если основной поток, то вы получили правильное решение. – zapl

+0

Вы можете использовать [CountDownLatch] (http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html), если у вас есть возможность ждать в параллельном потоке. Но это не дает вам обратного вызова. –

+0

Чтобы использовать обратные вызовы, вы можете использовать Futures и [добавить свой собственный интерфейс] (http://stackoverflow.com/questions/826212/java-executors-how-to-be-notified-without-blocking-when-a-task- завершает), чтобы получить обратный вызов. Но это слишком много для двух задач в одном месте. Поэтому ваши решения выглядят вполне разумно. –

ответ

2

OnPostexecute of AsyncTask будет вызван в основной поток, как только AsyncTask закончит свое задание. Поскольку окончательный обратный вызов будет в основном потоке, легко контролировать состояние каждой асинтезы, вызывая получение статуса для каждой асинтезы. get status()

+0

Это может быть хорошим решением! – Shi

+0

Могу ли я спросить, правильно ли мое решение? @ 7383 – Shi

+0

Да, вы следуете правильному подходу. Просто используйте встроенные методы asynctask вместо настраиваемых переменных. – 7383

0

Вы можете запустить два AsyncTask с и координировать их, но нить исполнитель работает в последовательном режиме по умолчанию и запускать их один за другим в любом случае. Итак, зачем писать код, который перескакивает через обручи, чтобы синхронизировать задачи и вызывать больше ошибок?

У меня был бы только один AsyncTask, который выполняет работу обеих задач в одной фоновой операции.

+0

Например, я использую синтаксический анализ как бэкэнд, первую асинтезу, чтобы получить список всех пользователей; вторую асинтеску, чтобы получить список всех моих друзей. Затем поместите всех пользователей в список и отметьте друзей. Для производительности я хотел бы сделать эти две асинхронные операции. Затем покажите их в Управлении. – Shi

+0

Так почему бы не один AsyncTask, который получает как список пользователей, так и список друзей? Если вы не начнете возиться с ThreadPoolExecutor, запуск двух AsyncTasks не будет быстрее, чем один AsyncTask. –

+1

Я действительно сомневаюсь, что две разные асинтеты запускаются последовательно. – 7383

Смежные вопросы