Почему отличается поведение Single при использовании just или fromCallable в startWith? - PullRequest
0 голосов
/ 01 февраля 2020

Я начинаю PublishSubject с testPublishSubject.startWith(createSingle().toObservable()).

Если я подпишусь на это наблюдаемое, избавлюсь и подпишусь снова, он выдаст другой элемент в зависимости от того, как я создал Single. Если я создаю его с помощью just, он выдает тот же элемент, что и в первый раз (item1), если я создаю его с fromCallable, он генерирует обновленный элемент (item2). Почему поведение отличается? Есть ли способ использовать just и заставить его вести себя как fromCallable?

Редактировать: Хорошо, я думаю, я знаю, почему он ведет себя по-другому. Это потому что это не воссоздание Single. fromCallable работает только из-за замыкания, которое выполняется снова с обновленным счетчиком.

Мой обновленный вопрос будет таким: есть ли способ заставить субъекта заново создать Single? Причина, по которой я этого хочу, заключается в том, что Single извлекает значение, которое, возможно, было обновлено, и мне нужно извлечь его снова.

var counter = 1

// With this, it works as expected
//    fun createSingle(): Single<String> = Single.fromCallable {
//        "item-${counter++}"
//    }
// With this, the second subscription still shows "item-1
fun createSingle(): Single<String> = Single.just("item-${counter++}")

val testPublishSubject = PublishSubject.create<String>()
val observable = testPublishSubject.startWith(createSingle().toObservable().doOnNext {
    log(">>> single on next: $it")
}).doOnNext {
    log(">>> publish subject on next: $it")
}

log(">>> subscribing1")
val disposable1 = observable.subscribe {
    log(">>> value subscription 1: $it")
}

log(">>> pushing random item")
testPublishSubject.onNext("random item")

log(">>> disposing subscription1")
disposable1.dispose()

log(">>> subscribing2")
val disposable2 = observable.subscribe {
    log(">>> value subscription 2: $it")
}
...