gpt4 book ai didi

android - RxJava Single.toCompletable() 似乎以某种方式打破了 Single

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:33 26 4
gpt4 key购买 nike

注意:事实证明,toCompletable() 并非错误,而是调用代码。调用代码使得更改此方法使其工作(或不工作)。


我有以下方法。它返回一个 Single。有用。执行内部代码,以便 remoteDataSource Single 下载数据,doOnSuccess 中的代码运行,我可以在那里设置断点。

但是,如果我像第二个示例那样将其转换为可完成的,它就会停止工作。数据未下载,doOnSuccess 中的代码从不运行。

我想在此方法中将其转换为 Completable,因为调用此方法的方法不需要数据,只需要成功/错误结果。

知道为什么会这样吗?

文档中说

Returns a {@link Completable} that discards result of the {@link Single} and calls {@code onComplete} when this source {@link Single} calls {@code onSuccess}. Error terminal event is propagated.

但我认为这意味着它会丢弃调用方法的东西,而不是当前方法。通过转换为 Completable,即使 remoteDataSource Single 也不会下载数据。

工作:

override fun downloadSomethingList(): Single<List<Something>> {
return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
.doOnSuccess { it: Map<String, List<Something>>
saveHash(SOMETHING_HASH, it.keys.first())
localDataSource.replaceSomethingList(it.values.first())
}.map {
it.values.first()
}
}

损坏:

override fun downloadSomethingList(): Completable {
return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
.doOnSuccess { it: Map<String, List<Something>>
saveHash(SOMETHING_HASH, it.keys.first())
localDataSource.replaceSomethingList(it.values.first())
}.toCompletable()
}

更新:

好的,这是我的调用方法。是的,这有点复杂。可能是其中的某些东西导致了问题。

fun downloadData(): Completable {
...
return repository.downloadThing1()
.flatMap { downloadedThing1 ->
...
repository.downloadThing2().toSingle()
}
.flatMap {
repository.getThing2()
}.flatMap { thing2 ->
...
repository.saveThing1(thing1).toSingle()
}
.flatMap {
if ("some condition") {
repository.downloadThing3()
.andThen(repository.downloadThing4())
.andThen(repository.downloadThing5())
.andThen(repository.downloadThing6()).toSingle()
} else {
Completable.complete().toSingle()
}
}.toCompletable()
.doOnComplete {
...
}
}

更新 2:

如果我使用下面的调用代码就可以了! 所以吸取的教训是调用代码肯定能打断上游。更具体地说,我认为这是所有 toSingle() 调用。相反,我发现了似乎是为此目的而设计的 flatMapCompletable

由于问题中的原始代码实际上没有任何错误,我不得不将分数奖励给 Sanf0rd,以证明情况确实如此。

fun downloadData(): Completable {
...
return repository.downloadThing1()
.flatMapCompletable { downloadedThing1 ->
...
repository.downloadThing2()
}.andThen(repository.getThing2())
.flatMapCompletable { thing2 ->
...
repository.saveThing1(thing1)
if ("some condition") {
repository.downloadThing3()
.andThen(repository.downloadThing4())
.andThen(repository.downloadThing5())
.andThen(repository.downloadThing6())
} else {
Completable.complete()
}
}
.doOnComplete {
...
}
}

最佳答案

我编写了一小段代码来尝试它并且它正在工作:

val single = Single.create<Int> { emitter ->  emitter.onSuccess(5) }
val completable = single.map { it * 2 }.doOnSuccess { Log.d("MyTag", "$it")}.toCompletable()

completable.subscribe()

确保您使用单一和完整版本调用订阅。

关于android - RxJava Single.toCompletable() 似乎以某种方式打破了 Single,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50731806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com