2017-07-22 12 views
1

私はReplaySubjectを使って簡単なRxJavaを持っていますが、3つの数字がすべて印刷された結果を得ることができました。RxJava BehaviorSubjectが最後のアイテムを放出していませんか?

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") 
    } 

Iは動作に変更すると、私はいつも動作が最後に放出されたアイテムを再生することである考えとして、私は、第3の数即ち3が印刷されることを期待します。

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") 
    } 

ただし、何も印刷されません。どうして?

ここで重要なことは忘れましたか?はいの場合は、最後に放出されたアイテム(つまり3)を印刷する方法を教えてください。

+2

'BehaviorSubject'は設計完了後に最後の項目を保持しません。 'ReplaySubject.createWithSize(1)'を使って、上流が完了していなくてもaltestを常に再生させるべきです。 – akarnokd

+0

ありがとう@akarnokd。どのようにして、最後のアイテムを放出したいのですが、すべてではありませんか? – Elye

答えて

1

サブライセンスが既に終了しているため、何も印刷されません。サブスクリプションがまだアクティブである場合には3は、例えば、印刷される。

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) 

両方3及び4(遅延後)の後に放出される前に、サブスクリプション最新のイベントとして出射3及び4と、印刷されますサブスクリプション。さらにとしてコメントセクションReplaySubject.createWithSize(1)に@akarnokdによって説明

は常にさえ、観察終了後の最後の項目を再生すると、単一の項目に関係なく、ストリーム完了状態の必要があるならば、observable.takeLast(1).subscribe(subject)がそれを保証するために使用することができます使用することができます。

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") 
} 
+0

はい、それは、それが完了したので、それがもはや最後のアイテムを持っていない理由を説明します。しかし、最後のアイテムをまだ放出させたいのであれば、方法はありますか? – Elye

+0

@akarnokdが説明したように、 'ReplaySubject.createWithSize(1)'を使うと常に最後のアイテムを再生できます。 – hgrey

+0

私はそれを試しました、それはまだ3つのアイテムを再生しました:( – Elye

関連する問題