Поток блоков RXJava2 до тех пор, пока условие не будет выполнено - PullRequest
0 голосов
/ 19 июня 2019

У меня есть очередь файлов для загрузки, которые отправляются Observable, и я хотел бы загружать файлы только при наличии соединения WIFI.У меня есть решение, которое начнет отправлять очередь только тогда, когда установлено соединение WIFI, но в идеале я хотел бы проверить перед отправкой каждого элемента очереди (а затем блокировать его до тех пор, пока не будет установлено соединение WIFI).Таким образом, очередь будет блокировать загружаемые элементы, если Wi-Fi отключен во время загрузки очереди, и возобновит работу, когда она будет восстановлена.

Вот что у меня есть:

ReactiveNetwork.observeNetworkConnectivity(application)
    .filter(ConnectivityPredicate.hasState(NetworkInfo.State.CONNECTED))
    .filter(ConnectivityPredicate.hasType(ConnectivityManager.TYPE_WIFI))
    .take(1)
    .toFlowable(BackpressureStrategy.BUFFER)
    .flatMap { queueItemAvailable() }
    .flatMap { audioSampleUploader.uploadFile(it) }
    .subscribeOn(Schedulers.single())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { // SOMETHING HERE }

Поэтому я хотел бы переместить

queueItemAvailable()

на верхний уровень, а затем выполнить (блокировку) проверку сетевого подключения для каждого загружаемого элемента, но я довольно ржавый в своем RxJava, поэтому могуКак понять это?

Любая мудрость очень ценится?

1 Ответ

0 голосов
/ 19 июня 2019

Хорошо, вы должны попытаться объединить две наблюдаемые: одну для загрузки элементов и одну для проверки доступности Wi-Fi, я думаю, вам следует переместить всю проверку сетевого подключения в другой метод и вернуться на

ReactiveNetwork.observeNetworkConnectivity(application) .flatMap { queueItemAvailable() } .withLatestFrom {checkForWifiConnection(), BiFunction<QueueResult, Boolean, Pair< Boolean, QueueResult>> { wifiAvailable, queueResult -> Pair(queueResult, wifiAvailable) }).filter { it.first } .flatMap { audioSampleUploader.uploadFile(it) } .subscribeOn(Schedulers.single()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { // SOMETHING HERE }

извините за форматирование кода, но идея состоит в том, чтобы объединить Observables и вернуть пару и выдавать значения только при наличии соединения Wi-Fi.Я полагаю, что вы также можете использовать оператор zipwith для объединения наблюдаемых.

...