#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 ()» 🙂