RxJava BehaviorSubject no emite el último elemento?

Tengo un RxJava simple, usando ReplaySubject, pude get el resultado, donde se imprimen los 3 numbers.

val observable : Observable<Int> = Observable.just(1, 2, 3) val subject = ReplaySubject.create<Int>() observable.subscribe(subject) subject.subscribe{ result -> System.out.println("Start $result in Subscription Result") } 

Cuando cambio a Comportamiento, espero que se imprima el tercer número, es decir, 3, ya que siempre pensé que el Comportamiento es reproducir el último elemento emitido.

  val observable : Observable<Int> = Observable.just(1, 2, 3) val subject = BehaviorSubject.create<Int>() observable.subscribe(subject) subject.subscribe{ result -> System.out.println("Start $result in Subscription Result") } 

Sin embargo, no imprime nada. ¿Por qué?

¿Extrañé algo importante aquí? En caso afirmativo, avíseme cómo se imprime el último elemento emitido que supuso (es decir, 3).

No imprime nada porque subsription ya ha terminado. Si la suscripción todavía está activa, se imprimirán 3, por ejemplo:

 val o1: Observable<Int> = Observable.just(1, 2, 3) val o2: Observable<Int> = Observable.just(4).delay(100,TimeUnit.MILLISECONDS) val observable: Observable<Int> = Observable.concat(o1, o2) val subject = BehaviorSubject.create<Int>() observable.subscribe(subject) subject.subscribe{ result -> System.out.println("Start $result in Subscription Result") } Thread.sleep(1000) 

Se imprimirán 3 y 4 (después de la demora), con 3 como el evento más reciente antes de la suscripción y 4 después de la suscripción.

Además, como se explica en @akarnokd en la sección de comentarios ReplaySubject.createWithSize(1) puede usarse para reproducir siempre el último elemento incluso después de la finalización observable y si se necesita un solo elemento independientemente del estado de finalización de la secuencia, entonces observable.takeLast(1).subscribe(subject) se puede usar para garantizar que:

 val observable : Observable<Int> = Observable.just(1, 2, 3) val subject = ReplaySubject.createWithSize<Int>(1) observable.takeLast(1).subscribe(subject) //can be moved after subject.subscribe as well subject.subscribe{ result -> System.out.println("Start $result in Subscription Result") } 
  • Observables opcionales en combinar
  • Kotlin: Cómo convertir la testing que usa Thread.sleep a RxJava TestScheduler
  • Cómo retrasar onError () en RxJava 2 y Android?
  • RxJava 2 requiere un tipo de retorno Observable diferente de RxJava 1 (Kotlin)
  • Inferencia de tipo Observable.combineLatest en kotlin
  • ¿Cuál es la diferencia entre llaves y soportes normales en RxJava con Kotlin?
  • EXCEPCIÓN FATAL: RxCachedThreadScheduler-1 cuando el gatillo se deshace. ¿Por qué?
  • RxJava2 Publicado
  • Java genérico para Kotlin genérico. Retorno genérico del método
  • Confundido sobre la asignación de la variable RxJava
  • OnErrorNotImplementedException utilizando RxJava2 y Retrofit2 Mosby MVI