如果在 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" );
}
我需要在接收到事件(表示任何数据项 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" );
}