web-dev-qa-db-ja.com

RxJavaリレーとサブジェクト

私はジェイクウォーソンによってこのライブラリの目的を理解しようとしています: https://github.com/JakeWharton/RxRelay

基本的に、onCompleteまたはonErrorを呼び出すことができない場合を除いて、サブジェクト。サブジェクトは有害な方法でステートフルです。onCompleteまたはonErrorを受け取ると、データの移動に使用できなくなります。

考えはわかりますが、これは有効なユースケースですが、上記は既存のサブジェクトを使用するだけで簡単に実現できるようです。

1。errors/completionsイベントを件名に転送しないでください:

_`observable.subscribe({ subject.onNext(it) }, { log error / throw exception },{ ... })`
_

2。サブジェクトを公開せず、メソッドシグネチャがオブザーバブルを返すようにします。

fun(): Observable<> { return subject }

私は明らかにここで何かを見逃しており、それが何であるかについて非常に好奇心があります!

_class MyPublishRelay<I> : Consumer<I> {

    private val subject: Subject<I> = PublishSubject.create<I>()

    override fun accept(intent: I) = subject.onNext(intent)

    fun subscribe(): Disposable = subject.subscribe()
    fun subscribe(c: Consumer<in I>): Disposable = subject.subscribe(c)
    //.. OTHER SUBSCRIBE OVERLOADS
}
_
16
FRR

subscribeにはオーバーロードがあり、通常、人々はsubscribe(Consumer)オーバーロードに慣れています。次に、サブジェクトを使用し、突然onCompleteも呼び出されます。 RxRelayは、subscribe(Consumer)subscribe(Observer)の違いを考慮しないユーザーを自分から救います。

  1. エラー/完了イベントを件名に転送しないでください。

確かに、しかし、初心者との私たちの経験に基づいて、彼らはしばしばこれについて考えないか、考慮できる利用可能な方法についてさえ知りません。

  1. サブジェクトを公開しないでください。代わりに、メソッドシグネチャがオブザーバブルを返すようにします。

件名にアイテムを送信する方法が必要な場合、これは機能しません。目的は、サブジェクトを使用して、場合によっては別のObservableからアイテムのマルチキャストを実行することです。 Subjectを介して排出量を完全に制御している場合は、onCompleteを呼び出さず、他に何もさせないという良識が必要です。

9
akarnokd

件名を使用する場合は、subjects.getValueは常にnullの安全性に関するエラーをスローします。だから「?or !!」 nullにできないことはわかっていますが、コードのどこにでもあります。

public T getValue() {
    Object o = value.get();
    if (NotificationLite.isComplete(o) || NotificationLite.isError(o)) {
        return null;
    }
    return NotificationLite.getValue(o);
}
0
vijay