Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用flatMapCompletable不';不完整_Android_Rx Java_Observable_Completable Future - Fatal编程技术网

Android 使用flatMapCompletable不';不完整

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

我有一个observable,它可以发送项目并将它们上传到服务器

代码如下:

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文件),它看起来好像什么都没有处理。