Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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 RxJava Single to Completable to Single-如何将第一个单曲的结果传递给第二个单曲_Android_Rx Java2 - Fatal编程技术网

Android RxJava Single to Completable to Single-如何将第一个单曲的结果传递给第二个单曲

Android RxJava Single to Completable to Single-如何将第一个单曲的结果传递给第二个单曲,android,rx-java2,Android,Rx Java2,在下面的方法中,如何将第一个单曲的结果传递给第二个单曲 正如现在编写的,当它返回时,somethingId为空。如果我将返回的Single.just(somethingId)中的值更改为空字符串以外的值,它将返回该值 有趣的是,如果我将断点插入该方法,它会在第7行停止,然后再转到第5行和第6行 第7行的和文档说明: 返回一个将订阅此Completable的单,一旦完成,则返回 将订阅{@code next}单一源代码 为什么它看起来是按那个顺序执行的,和/或有更好的方法吗 1 override

在下面的方法中,如何将第一个单曲的结果传递给第二个单曲

正如现在编写的,当它返回时,
somethingId
为空。如果我将返回的
Single.just(somethingId)
中的值更改为空字符串以外的值,它将返回该值

有趣的是,如果我将断点插入该方法,它会在第7行停止,然后再转到第5行和第6行

第7行的
文档说明:

返回一个将订阅此Completable的单,一旦完成,则返回 将订阅{@code next}单一源代码

为什么它看起来是按那个顺序执行的,和/或有更好的方法吗

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }
1 override fun downloadshoothing():Single{
2 var somethingId=“”
3 return remoteDataSource.downloadSomething()//这是一个
4.flatMapCompletable{something->
5 somethingId=something.id
6 saveSomething(something)//这是一个完整的
7}.然后(单身。只是(某样东西))
8 }

在这一点上,我唯一能想到的是为第6行的
saveSomething()
方法返回一个Single。然而,我正在更改该方法的签名,这样我就可以在这个感觉不正确的特定方法中使用它。当然有一种方法可以让它在不做那件事的情况下发挥作用

如果您完全避免
flatMapCompletable
操作,则可以在不更改
saveSomething
方法签名的情况下获得相同的结果:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4            saveSomething(something).andThen(Single.just(something.id))
5        }
6 }
1 override fun downloadshoothing():Single{
2返回remoteDataSource.downloadSomething()//这是一个
3.平面图{某物->
4.保存某物(某物)。然后(单身。只是(某物。id))
5        }
6 }
或:

1 override fun downloadshoothing():Single{
2返回remoteDataSource.downloadSomething()//这是一个
3.平面图{某物->
4 saveSomething(something.toSingleDefault(something.id)
5        }
6 }

目前的问题是,
Single.just(somethingId)
作为RxJava管道创建的一部分执行,因此,它发生在下载完成之前,因此
somethingId
的值仍然是空字符串。

是否应该
saveSomething
必须是可完成的?如果没有,您可以编写
remoteDataSource.downloadSomething().doOnComplete{saveSomething(it)}.map(it.id)
yes,因为调用函数必须等待此操作完成后才能继续(它将尝试使用id在本地获取下载的内容)。哇,谢谢!回答得很好。我还在学习编写RxJava的方法,你给了我更多的想法,并解释了哪里出了问题。很高兴我能帮上忙!
1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4           saveSomething(something).toSingleDefault(something.id)
5        }
6 }