可观察的订阅不会被调用相同的值

时间:2019-03-29 17:43:22

标签: android kotlin rx-java2 behaviorsubject

我有一个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)时总能得到订阅?

1 个答案:

答案 0 :(得分:1)

您可能正在用BehaviorSubject / onComplete完成onError流。如果您不想这样做,则将x / error包装到某种密封的类并具有SuccessFailure子类的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)
            }
        }
    }

}