RxJava。使用罕见的额外消息进行定期服务器轮询

时间:2015-10-20 12:06:44

标签: android reactive-programming rx-java

我有这样的服务器轮询解决方案:

Observable
    .interval(UPDATE_PERIOD_SEC, UPDATE_PERIOD_SEC, 
        TimeUnit.SECONDS, Schedulers.newThread())
    .flatMap(new Func1<Long, Observable<NewMessagesCountModel>>() {})
    .retry()
    .distinct()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .compose(this.<NewMessagesCountModel>bindToLifecycle())
    .subscribe(new Subscriber<NewMessagesCountModel>() {});

我希望在不等待下一轮询事件的情况下立即更新数据。我该怎么办?

2 个答案:

答案 0 :(得分:1)

每当您想要触发服务电话时,您可以混合PublishSubject并呼叫onNext()

PublishSubject<Long> manual = PublishSubject.create();

Observable
.interval(UPDATE_PERIOD_SEC, UPDATE_PERIOD_SEC, 
    TimeUnit.SECONDS, Schedulers.newThread())
.mergeWith(manual.onBackpressureDrop().observeOn(Schedulers.newThread()))
.flatMap(new Func1<Long, Observable<NewMessagesCountModel>>() {})
.retry()
.distinct()
.observeOn(AndroidSchedulers.mainThread())
.compose(this.<NewMessagesCountModel>bindToLifecycle())
.subscribe(new Subscriber<NewMessagesCountModel>() {});

manual.onNext(-100L);

此外,我认为没有必要调用subscribeOn,因为没有副作用可以从调用线程移开。

如果您想避免手动通话过于接近定期通话,可以在debounce之前应用flatMap

答案 1 :(得分:0)

只需在没有间隔运算符的情况下创建另一个没有间隔的observable。

Observable
    .flatMap(new Func1<Long, Observable<NewMessagesCountModel>>() {})
    .retry()
    .distinct()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .compose(this.<NewMessagesCountModel>bindToLifecycle())
    .subscribe(new Subscriber<NewMessagesCountModel>() {});