Android 使用flatMapCompletable不';不完整
我有一个observable,它可以发送项目并将它们上传到服务器 代码如下:Android 使用flatMapCompletable不';不完整,android,rx-java,observable,completable-future,Android,Rx Java,Observable,Completable Future,我有一个observable,它可以发送项目并将它们上传到服务器 代码如下: repository .getItems() .doOnComplete(() -> Log.d(TAG, "No items left.")) .flatMapCompletable(item -> repository .uploadIt
repository
.getItems()
.doOnComplete(() -> Log.d(TAG, "No items left."))
.flatMapCompletable(item ->
repository
.uploadItems(item)
.onErrorComplete()
.andThen(
deleteTemporaryItem()
.onErrorComplete()
)
);
getItems方法一个接一个地发送项目,然后完成,uploadItems方法将它们上载到服务器。问题是,当没有任何项目all-chain onComplete事件正常运行,并且我的所有订阅者都获得此事件并继续它时,但是当有一些项目并且所有项目都已上载到Complete事件时,不会超过.doOnComplete(()->Log.d(标记,“no items left.”)方法,并且所有订阅者都不会获得此事件。我添加了onErrorComplete,以确保uploadItems之后的所有方法都已完成,并且我在日志中看到所有方法都已完成,但存储库中的onComplete事件。getItems()不会转到所有订阅服务器
有人能帮忙找出这种行为的原因吗
提前谢谢 请看一下这个例子: 我通过每个步骤传递项目,因此订阅将收到已处理的每个项目的通知。处理管道涉及上载和删除文件 请尝试更改实现并发布输出日志
@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);
}
@测试
void name()引发异常{
可流动已完成的工作=可流动。仅(1,2,3)
.map(整数->整数*1000)
.flatMapSingle(整数->
Completable.fromAction(()->{
睡眠(整数);
//在这里上传东西吗
})
.doOnComplete(()->System.out.println(“上载的文件…”)
//.超时(10,时间单位为秒)
.重试(3)
.然后(
Completable.fromAction(()->{
//不要删除东西。。。
})
.重试(2)
//.超时(10,时间单位为秒)
.doOnComplete(()->System.out.println(“已删除的文件…”))
)
.toSingle(()->整数)
)
.doOnComplete(()->System.out.println(“已完成的工作”);
已完成的工作。测试()
.等待
.资产结果(100020003000);
}
对不起,我不明白问题出在哪里。您能提供更多关于您的问题和所用方法的方法签名的信息吗?@HansWurst您好!我刚刚编辑了一个问题!谢谢你的关注!我认为有一些误解。当可观察对象完成时,将调用DoOnComplete。只有在处理了从getItems()获得的所有值后,才能完成可观察项。如果所有项目都使用Completeable.complete完成,则可观察项目将完成。如果有一个项目,即flatMapped blocks(要上传的larg文件),它看起来好像什么都没有处理。