Reputation: 1090
I need to perform some action in X seconds after received an event (represented any data item rxJava). But if got another event before X seconds ends, timer reset and action need to be performed again in X seconds.
Another words, we have UI elements with which user may interact. After X seconds of user's inactivity with this UI element we need to perform some action. Trivial solution could look like:
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();
}
How to do this without disposing and re-creation Flowable basing on some rxJava operators?
Upvotes: 0
Views: 998
Reputation: 1029
Try the throttleWithTimeout(...)
operator:
@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" );
}
Upvotes: 0
Reputation: 2200
I am not too familiar with rxJava, but the operator you are looking for is probably debounce. So maybe something like this:
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();
}
Upvotes: 1