Можно ли отключить throttleLast на некоторое время? - PullRequest
0 голосов
/ 26 февраля 2019

Мои события быстро поступают из системы, но мне нужно только фактическое значение каждые 500 мс, поэтому я использую tthrottle.Однако после того, как пользователь сделал ввод, я бы хотел отключить throtle для 1 события, чтобы оно продолжалось как можно скорее.Есть ли способ отключить его или указать, что следующее событие должно быть принудительным?

observable = observable.throttleLast(500, TimeUnit.MILLISECONDS);
observable = observable.observeOn(AndroidSchedulers.mainThread());
observable = observable.subscribeOn(Schedulers.io());
observable.subscribe(...)

1 Ответ

0 голосов
/ 26 февраля 2019

Вы не можете отключить поведение throttleLast.Самое близкое, что вы можете сделать, это опубликовать последовательность и переключиться между двумя режимами обработки:

source
.observeOn(Schedulers.single())
.publish(o ->
    o.throttleLast(500, TimeUnit.MILLISECONDS, Schedulers.single())
    .take(1)
    .concatWith(o.takeUntil(1, TimeUnit.SECONDS, Schedulers.single()))
    .repeat()
    .takeUntil(o.ignoreElements().toObservable())
)

Таким образом, дросселируйте в течение 500 миллисекунд, что должно привести к одному элементу, затем переключитесь на нерегулируемую последовательность на 1 секунду, затемповторите с начала с дросселированием и т. д. Чтобы избежать потери данных из-за переключения режима, вы должны использовать однопоточный планировщик, такой как single(), но он все еще не свободен от потери данных на 100%.Лучшим является выделенный уникальный оператор.

Редактировать: Существует необходимость в дополнительном takeUntil для остановки повтора, если источник прекратил работу самостоятельно.

...