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 }