如果在 RxJava 的某个时间段内获得第二项,如何跳过第一项

How to skip first item if got second on some time period on RxJava

我需要在接收到事件(表示任何数据项 rxJava)后的 X 秒内执行一些操作。但是,如果在 X 秒结束之前收到另一个事件,则需要在 X 秒后再次执行计时器重置和操作。

换句话说,我们有 UI 个用户可以与之交互的元素。在用户对这个 UI 元素不活动 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();
}

如何在不基于某些 rxJava 运算符处理和重新创建 Flowable 的情况下做到这一点?

我对rxJava不太熟悉,不过你要找的operator大概是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();
}

试试 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" );
}