注意:事实证明toCompletable()
没有错,但它是调用代码。调用代码是这样的,改变这个方法使它工作(或不工作)。
我有以下方法。它返回一个Single。有用。执行内部代码,以便remoteDataSource Single下载数据,doOnSuccess
中的代码运行,我可以在那里断点。
但是,如果我将其转换为可完成的,如第二个示例中所示,它将停止工作。不下载数据,doOnSuccess
内的代码永远不会运行。
我想在此方法中将其转换为Completable,因为调用此方法的方法不需要数据,只需要成功/错误结果。
知道为什么会这样吗?
它在文档中说明
返回{@link Completable},丢弃{@link Single}的结果 当此来源{@link Single}调用时调用{@code onComplete} {@code onSuccess}。传播错误终端事件。
但我认为这意味着它会丢弃调用方法的内容,而不是当前的方法。通过转换为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 {
...
}
}
答案 0 :(得分:4)
我制作了一小段代码来试用它并且它正在工作:
val single = Single.create<Int> { emitter -> emitter.onSuccess(5) }
val completable = single.map { it * 2 }.doOnSuccess { Log.d("MyTag", "$it")}.toCompletable()
completable.subscribe()
确保使用Single和Completable版本调用subscribe。