使用flatMapCompletable的RxJava 2 Observable并不完整

时间:2017-10-03 13:18:36

标签: android rx-java observable completable-future

我有一个可观察的项目并将其上传到服务器。

以下是代码:

repository
            .getItems()
            .doOnComplete(() -> Log.d(TAG, "No items left."))
            .flatMapCompletable(item ->
                    repository
                            .uploadItems(item)
                            .onErrorComplete()
                            .andThen(
                                    deleteTemporaryItem()
                                            .onErrorComplete()
                            )
            );

getItems方法逐个发出项目然后完成,uploadItems方法将它们上传到服务器。问题是当没有项目所有链onComplete事件工作正常并且我的所有订阅者都得到此事件并继续它但是当有一些项目并且所有这些项目都被上传到完成事件时不会超过.doOnComplete( () - > Log.d(TAG,"没有剩余项目。"))方法和所有订阅者都没有得到此事件。我添加了onErrorComplete以确保uploadItems之后的所有方法都完成了,我还在日志中看到所有这些方法都已完成,但来自repository.getItems()的onComplete事件并没有转到所有订阅者。

有人可以帮忙找出导致这种行为的原因吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

请看一下这个例子:

我将项目传递到每个步骤,因此将在已处理的每个项目上通知订阅。处理管道涉及上传和删除文件。

请尝试更改实施并发布输出日志。

@Test
void name() throws Exception {
    Flowable<Integer> completed_work = Flowable.just(1, 2, 3)
            .map(integer -> integer * 1000)
            .flatMapSingle(integer ->
                    Completable.fromAction(() -> {
                        Thread.sleep(integer);
                        // do upload stuff here
                    })
                            .doOnComplete(() -> System.out.println("Uploaded file ...."))
                            //.timeout(10, TimeUnit.SECONDS)
                            .retry(3)
                            .andThen(
                                    Completable.fromAction(() -> {
                                        // do delete stuff...
                                    })
                                            .retry(2)
                                            //.timeout(10, TimeUnit.SECONDS)
                                            .doOnComplete(() -> System.out.println("Deleted file ..."))
                            )
                            .toSingle(() -> integer)
            )
            .doOnComplete(() -> System.out.println("Completed work"));


    completed_work.test()
            .await()
            .assertResult(1000, 2000, 3000);
}