RxJava - 发送队列中的项目

时间:2016-11-07 13:39:32

标签: java android queue buffer rx-java

我有一个观察到:

  • 几秒钟后发出数据。

  • 可以多次触发。

  • 操作不能并行执行。所以我们需要一个缓冲区。

我理解这一点并不清楚,所以让我用例子来解释:

Observable<IPing> pingObservable = Observable.defer(() -> 
                         new PingCommand(account, folders)
                             .post()
                             .asObservable()
                     );
这是主要特征。它不应该在前一个执行时再次被调用,但它应该记住用户再次请求它。所以我创建了关闭缓冲区PublishSubject

closeBuffer = PublishSubject.create();

现在我想知道如何合并它。

我试过这个:

Observable.defer(() -> new PingCommand(account, folders)
            .post()
            .asObservable()
            .buffer(() -> closeBuffer)
            .flatMap(Observable::from)
            .first()
);

但它没有按我的意愿工作。

编辑: 我会试着更好地解释一下:

我正在向服务器发送POST - 我们可以等待几分钟的响应(因为它是Exchange ActiveSync PUSH)。当一个请求发送时,我无法再次ping通。所以我必须等到一个请求完成。我不需要缓冲那些可观察量 - 只是在用户请求ping时的信息 - 并在第一次完成后发送请求。我只是在学习反应,所以我不知道如何真正使用复杂的功能,如背压。

这就是我想要解决这个问题的方法(伪代码)

??????<Result> request
        = ????.???()
        .doOnNext( result -> { … })
        .doOnSubscribe(() -> { … })
        .doOnCompleted(() -> { … })
        .…
        //__________________________________________________________

        Observable<Result> doAsyncWork(Data data) { … } // this is API function
        //__________________________________________________________
        // api usage example

        Subscription s1 = doAsyncWork(someData).subscribe() // start observing async work; executed doOnSubscribe
        Subscription s2 = doAsyncWork(someData).subscribe() // wait for async work result …
        //__________________________________________________________

        // after some time pass, maybe from other thread
        Subscription s1 = doAsyncWork(someData).subscribe() // wait for async work result …
        //__________________________________________________________

        // async work completes, all subscribers obtain the same result; executed doOnCompleted
        //__________________________________________________________

        // again
        Subscription s1 = doAsyncWork(someData).subscribe() // start observing async work; executed doOnSubscribe


        // async work completes, subscriber obtains result; executed doOnCompleted

显然,我可以使用if,但我想知道如何以适当的方式做到这一点。

0 个答案:

没有答案