Наблюдаемая подписка не вызывается на то же значение - PullRequest
0 голосов
/ 29 марта 2019

У меня есть 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.subscribe{list -> 
     //only called once
     anotherfun(list)
}

В первый раз, когда вызывается моя функция Retrofit, я могу вызвать подписку, но последующие вызовы той же функции не вызывают подписку. Я предполагаю, что вызовы обычно возвращают одно и то же значение, потому что это просто обновление и данные могут не измениться. Тем не менее, мне все еще нужно вызвать подписку, чтобы я мог реагировать соответственно. Я пробовал и BS и ReplaySubject, но результат тот же. Как я могу использовать observable, чтобы гарантировать, что подписчик всегда вызывается всякий раз, когда я вызываю onNext (x) / onComplete (x), даже если x не изменился?

1 Ответ

1 голос
/ 29 марта 2019

Вы, вероятно, заканчиваете свой BehaviorSubject поток с onComplete / onError. Если вы не хотите этого делать, поместите x / error в какой-нибудь Result, который является запечатанным классом и имеет подклассы Success и Failure. Затем всегда используйте 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)
            }
        }
    }

}
...