我有一个BehaviourSubject作为我的Retrofit方法的回调。
private val loadCompleted = BehaviourSubject.create<List<String>>()
在改造OnResponse / onFailure内,我致电
loadCompleted.onNext(myList) //inside retrofit onResponse and
loadCompleted.onError("Error") // inside retrofit onFailure
我订阅了一个返回loadCompleted的函数。
fun loadingCompleted() : Observable<List<String>>{return loadCompleted}
然后我将loadingCompleted订阅为
loadingCompleted.subscribe{list ->
//only called once
anotherfun(list)
}
第一次调用Retrofit函数时,我可以调用我的订阅,但是随后对该函数的调用不会触发订阅。我假设调用通常返回相同的值,因为这只是刷新并且数据可能没有更改。但是,我仍然需要调用subscribe,这样我才能做出相应的反应。我已经尝试了BS和ReplaySubject,但是结果是相同的。即使x可能没有更改,我如何使用可观察的方法来确保每次调用onNext(x)/ onComplete(x)时总能得到订阅?
答案 0 :(得分:1)
您可能正在用BehaviorSubject
/ onComplete
完成onError
流。如果您不想这样做,则将x / error包装到某种密封的类并具有Success
和Failure
子类的Result中。然后始终使用subject.onNext()
发光。
sealed class Result<T> {
class Success<T>(val t: T) : Result<T>()
class Failure<T>(val e: Throwable) : Result<T>()
}
class Test {
val subject: BehaviorSubject<Result<List<String>>> = BehaviorSubject.create()
fun call() {
subject.onNext(Result.Success(listOf("example")))
subject.onNext(Result.Failure(RuntimeException("error")))
subject.subscribe{result->
when(result){
is Result.Success -> print(result.t)
is Result.Failure -> print(result.e.message)
}
}
}
}