別のスレッドで購読BehaviorSubject

ケリー:

私はRxJavaに新たなんだと私はそれがうまく私のユースケースに適しているだろうと思ったので、私はそれを使用することにしました。

私はいくつか持っているInteger私は時間の無限の期間にわたって観測したい値を。たび私はそのオブザーバーのすべてが上で呼び出すことがしたい、これらの値の変化(すなわちイベント)の一つ別のスレッド

私は、私が使用するために必要と思わ長い観測時間要件のため、BehaviorSubject(最初は思ったが、クラスをObservable私は単に「観察」に必要と見て..私は必要なことをすべてだった)、私は使用することができsubscribeOn()、スケジューラを設定する方法を、したがって、バックグラウンドスレッド上のユーザを呼び出し達成:

private BehaviorSubject<Integer> rotationPositionSubject = BehaviorSubject.createDefault(getRotorPosition());
rotationPositionSubject.subscribeOn(scheduler);

そして、私が持っているrotate()私が更新するのに使用される方法rotationPositionSubjectメインスレッドから呼び出されるであろうが。

@Override
public synchronized int rotate()
{
    final int newRotorPosition = super.rotate();
    rotationPositionSubject.onNext(newRotorPosition);

    return newRotorPosition;
}

しかし、上記のコードで私は、加入者が「メイン」スレッドで呼ばれていることがわかりました。以下のためのドキュメント調べるsubscribeOnを()

戻り値:

ソースObservableSourceは、そのサブスクリプションが指定されたスケジューラに起こるように修正しました

私は返さObservableSourceを使用していないが、リターン・オブジェクトがあると動作しません、私の上記のコードは、だから、Observable自分のアプリケーションのために役に立たないしていますか?

質問は、どのように私は、長期的RxJavaと、バックグラウンドスレッド上の任意のオブジェクトと呼び加入観察んそしてあるかRxJavaは間違った選択でありますか?

ケリー:

使用している場合1は、いくつかの注意が必要であるかのように、いくつかの実験の後に見えるBehaviorSubjectオブジェクトを、私は様々なインタフェースの名前から推測としてそれらの使用はそれほど明白ではありません。

私は現在やっているものを実証するための試験方法として:

@Test
public void test()
{
    System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
    final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
    rotorBehaviour.subscribeOn(Schedulers.single());
    rotorBehaviour.subscribe(new Observer<Integer>()
    {
        @Override
        public void onSubscribe(final Disposable d)
        {
            System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onNext(final Integer integer)
        {
            System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onError(final Throwable e)
        {
            System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onComplete()
        {
            System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
        }
    });


    rotorBehaviour.onNext(1);
    rotorBehaviour.onNext(2);

}

望ましくない結果でこの結果:

スレッドIDにテストを実行する:1
onSubscribe()スレッドIDで呼び出さ:1
onNext()スレッドIDで呼び出さ:1
onNext()スレッドIDで呼び出さ:1

プロセスは、終了コードを終了0

(望ましくない理由は、onNext()メインスレッドで呼び出されます)

使用するコードの変更Observableへの呼び出しから返されると、subscribeOn同じ望ましくない結果を与えます:

@Test
public void test()
{
    System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
    final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
    Observable<Integer> rotorObservable = rotorBehaviour.subscribeOn(Schedulers.single());

    rotorObservable.subscribe(new Observer<Integer>()
    {
        @Override
        public void onSubscribe(final Disposable d)
        {
            System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onNext(final Integer integer)
        {
            System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onError(final Throwable e)
        {
            System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onComplete()
        {
            System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
        }
    });
    rotorBehaviour.onNext(1);
    rotorBehaviour.onNext(2);
}

結果:

スレッドIDにテストを実行する:1
onSubscribe()スレッドIDで呼び出さ:1
onNext()スレッドIDで呼び出さ:1
onNext()スレッドIDで呼び出さ:1

プロセスは、終了コードを終了0

しかし、使用してobserveOn()目的の結果が得られない方法を:

@Test
public void test()
{
    System.out.println("Executing test on thread ID: " + Thread.currentThread().getId());
    final BehaviorSubject<Integer> rotorBehaviour = BehaviorSubject.create();
    Observable<Integer>rotorObservable = rotorBehaviour.observeOn(Schedulers.single());

    rotorObservable.subscribe(new Observer<Integer>()
    {
        @Override
        public void onSubscribe(final Disposable d)
        {
            System.out.println("onSubscribe() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onNext(final Integer integer)
        {
            System.out.println("onNext() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onError(final Throwable e)
        {
            System.out.println("onError() called on thread ID: " + Thread.currentThread().getId());
        }

        @Override
        public void onComplete()
        {
            System.out.println("onComplete() called on thread ID: " + Thread.currentThread().getId());
        }
    });
    rotorBehaviour.onNext(1);
    rotorBehaviour.onNext(2);
}

スレッドIDにテストを実行する:1
onSubscribe()スレッドIDで呼び出さ:1
onNext()スレッドIDで呼び出さ:13
onNext()スレッドIDで呼び出さ:13

プロセスは、終了コードを終了0

また、私はまだ使用していた全ての例ではBehaviorSubject、イベントを開始するためのオブジェクトを、私はこれだけは望ましい結果を与えることを偶然見つけました。

どのような私を懸念することは、私が使用している可能性があるということであるObservableBehaviorSubject私だけの加入者は、バックグラウンドスレッドで呼ばれている。すなわち、正しい結果を与える「たまたま」ということ。間違った方法で、私はドキュメントのどこかにそれを見逃している場合を除き、望ましい結果を得るために、これらのオブジェクトを使用する方法を明らかに表示されません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=193890&siteId=1