RxJava:如何刷新定时缓冲区?

时间:2019-04-26 15:15:00

标签: rx-java rx-java2 rx-android

我正在创建此PublishProcessor,每10秒钟将其元素保存到数据库中

    val publishProcessor = PublishProcessor.create<Entity>()

    publishProcessor
        .buffer(10, SECONDS)
        .observeOn(Schedulers.io())
        .subscribe(
            { saveToDatabase(it) },
            { Log.e("TAG", "Error: $it") })
        .addTo(compositeDisposable)

我的活动结束后,我想刷新当前缓冲区中的所有内容,而不要等待10秒。我该怎么办?

1 个答案:

答案 0 :(得分:2)

将另一个主题作为缓冲区边界与间隔合并:

PublishSubject<Entity> publishProcessor = PublishSubject.create();

Subject<Long> flush = PublishSubject.<Long>create().toSerialized();

publishProcessor
    .buffer(flush.mergeWith(Observable.interval(10, TimeUnit.MILLISECONDS)))
    .observeOn(Schedulers.io())
    .subscribe(...)

flush.onNext(1L);

如果您还想在手动冲洗时重置计时器

publishProcessor
    .buffer(
        flush.mergeWith(Observable.timer(10, TimeUnit.MILLISECONDS))
        .take(1)
        .repeat()
    )
    .observeOn(Schedulers.io())
    .subscribe(...)