2016-06-27 4 views
2

У меня есть Observable (который получает данные из сети). Проблема в том, что наблюдаемые могут быть быстрыми или медленными в зависимости от условий сети.RxJava Наблюдаемое минимальное время выполнения

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

Оператор «Задержка» не является вариантом, поскольку он будет задерживаться даже при медленной сети.

ответ

4

Для этого вы можете использовать Observable.zip(). Учитывая

Observable<Response> network = ... 

можно сделать

Observable<Integer> readyNotification = Observable.just(42).delay(1, TimeUnit.SECONDS); 
Observable delayedNetwork = network.zipWith(readyNotification, 
               (response, notUsed) -> response); 
+1

1) Почему бы не использовать только «таймер»? 2) Обратите внимание, что сеть может выйти из строя до истечения таймаута. Если вы хотите, чтобы этот тайм-аут всегда использовался, попробуйте 'mergeDelayError', а затем используйте, например,' reduce', чтобы преобразовать два элемента в один. – marwinXXII

+0

2) можно решить с помощью материализации() сразу после сети и dematerialize() после zipWith(). Не уверен относительно релевантности mergeDelayError() для предлагаемого решения - вы могли бы комментировать исходный вопрос или добавить его в качестве другого ответа. –

+0

'mergeWithDelay' гарантирует, что если одна последовательность прерывается, другая последовательность либо успешно завершает, либо возвращает ошибку (и не отменяется досрочно) , Зависит от того, какой вопрос автор хочет реализовать. – marwinXXII

0

Использование Observable.concatEager()

Это позволяет заставить один поток, чтобы завершить после другого (оператор Concat), но и пнуть сетевой запрос сразу без дождаться завершения первого аргумента (concatEager):

Observable<Response> responseObservable = ...; 

Observable<Response> responseWithMinDelay = Observable.concatEager(
        Observable.timer(1, TimeUnit.SECONDS).ignoreElements(), 
        responseObservable 
).cast(Response.class); 
Смежные вопросы