Как пропустить первый элемент, если получил второй за некоторый период времени на RxJava - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно выполнить какое-то действие через X секунд после получения события (представлен любой элемент данных rx Java). Но если получено другое событие до истечения X секунд, сброс таймера и действие должны быть выполнены снова через X секунд.

Другими словами, у нас есть элементы пользовательского интерфейса, с которыми пользователь может взаимодействовать. После X секунд бездействия пользователя с этим элементом пользовательского интерфейса нам нужно выполнить какое-то действие. Тривиальное решение может выглядеть следующим образом:

Disposable disp;
void init() {
             final Flowable<Boolean> flowable = 
mapDragOrZoomSubject.delay(TIME_X, TimeUnit.SECONDS)
                    .toFlowable(BackpressureStrategy.DROP);
        disp = flowable. ...subscribeWith(ACTION);  // <-- action in X seconds of inactivity
    }

void gotNewUserInteraction() {
    disp.dispose();
    init();
}

Как это сделать без удаления и повторного создания Flowable на основе некоторых операторов rx Java?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Я не слишком знаком с rx Java, но вы ищете оператора, вероятно, debounce . Так что может быть что-то вроде этого:

Disposable disp;
void init() {
             final Flowable<Boolean> flowable = 
mapDragOrZoomSubject.delay(TIME_X, TimeUnit.SECONDS)
                    .toFlowable(BackpressureStrategy.DROP);
        disp = flowable
                 ...
                 .debounce(TIME_X, TimeUnit.SECONDS)
                 .subscribeWith(ACTION);  // <-- action in X seconds of inactivity
    }

void gotNewUserInteraction() {
    disp.dispose();
    init();
}
0 голосов
/ 17 апреля 2020

Попробуйте оператор throttleWithTimeout(...):

@Test
public void testThrottleWithTimeout()
{
    Subject<String> eventSubject = PublishSubject.create();
    TestScheduler scheduler = new TestScheduler();

    TestObserver<String> observer = eventSubject
            .throttleWithTimeout( 1, TimeUnit.SECONDS, scheduler )
            .test();

    eventSubject.onNext( "foo" );
    scheduler.advanceTimeBy( 500, TimeUnit.MILLISECONDS );
    observer.assertNoValues();

    eventSubject.onNext( "bar" );
    scheduler.advanceTimeBy( 500, TimeUnit.MILLISECONDS );
    observer.assertNoValues();

    scheduler.advanceTimeBy( 500, TimeUnit.MILLISECONDS );
    observer.assertValue( "bar" );
}
...