Как выполнить несколько асинхронных (RX) вызовов и дождаться их завершения в Kotlin?

#android #kotlin #rx-java

#Android #kotlin #rx-java

Вопрос:

Я пытаюсь найти способ запустить некоторый код после завершения 3 асинхронных rx-fun.

Кто-нибудь знает хороший способ сделать это с помощью RX?

Я очень новичок в этой теме, и у меня нет никакого работоспособного кода для показа, но я могу сказать, что способ, которым я решаю проблему в своем коде прямо сейчас, — это установить 3 логических значения в true после завершения асинхронной части каждого развлечения, а затем в моем коде, который ожидает, яя запускаю 4-ю функцию (RX Flowable), которую я подключил к этой проверке, если все 3 логических значения являются истинными.

Это выглядит примерно так:

 // var async1IsDoneBoolean = false
// var async2IsDoneBoolean = false
// var async3IsDoneBoolean = false

fun async1() {
    // Start async work {
    // working..
    // done!
    // async1IsDoneBoolean = true
    // }
}
fun async2() {
    // Start async work {
    // working..
    // done!
    // async2IsDoneBoolean = true
    // }
}
fun async3() {
    // Start async work {
    // working..
    // done!
    // async3IsDoneBoolean = true
    // }
}

fun useResulfOfAsyncFuns() {
    // Create and subscribe to RX Flowable (will repeat until unsubscribed)
    // if (async1IsDoneBoolean amp;amp; async2IsDoneBoolean amp;amp; async3IsDoneBoolean) {
    // Run code after all async is done
    // }
}

 main() {
    async1()
    async2()
    async3()
    useResulfOfAsyncFuns()
 }
 

Комментарии:

1. Я мало что знаю о Rx, но вы можете легко сделать это с помощью сопрограмм, присоединившись к заданию, или если вы хотите получить какой-то результат от работы, ожидающей отложенного.

2. Спасибо за ответ, я просматривал сопрограммы, и мне очень хочется выбрать этот вариант. Однако я забыл упомянуть, что асинхронные функции — это вызовы к базе данных Room, которая уже реализована с использованием RX, поэтому мне пришлось бы внести некоторые изменения в код и в других местах.

3. посмотрите на flatmap

Ответ №1:

Вы можете использовать Completable.merge различные методы, запускаемые асинхронно через subscribeOn :

 Completable.mergeArray(
   Completable.fromAction { async1() }.subscribeOn(Schedulers.io()),
   Completable.fromAction { async2() }.subscribeOn(Schedulers.io()),
   Completable.fromAction { async3() }.subscribeOn(Schedulers.io())
)
.andThen(Flowable...)
 

Комментарии:

1. Спасибо! Это была именно та функциональность, которую я искал! Теперь мои асинхронные функции выполняются асинхронно, а затем завершаются, а затем код / поток в «andThen ()» 🙂