1

非常に単純な RXJava エミッターがあります。実際にはpublishSubjectですが、サブスクライブ時に整数を文字列に変換し、後でUI要素を更新するのはその仕事です。コードは次のようになります。

PublishSubject integerToStringEmitter = PublishSubject.create();

    Subscription mysingle= Single.just(4).map(new Func1<Integer, String>() {


        @Override
        public String call(Integer integer) {
            return String.valueOf(integer);
        }
    }).subscribe(new Observer<String>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            tv.setText(s);
        }
    });
// integerToStringEmitter.subscribe(); //it still emits even without this, why ?

私がしたいこと: サブスクリプションは、integerToStringEmitter.subscribe();を呼び出したときにのみ開始されます。

現在何が起こっていますか: プログラムを起動するとすぐに onNext が呼び出され、UI 要素が #4 に設定されています。なぜですか? このことをもっと制御する必要があるので、サブスクライブしなくてもすぐに実行されません。解決にご協力ください。

4

1 に答える 1

2

あなたが何を達成しようとしているのかわかりません。あなたのコードは正しく見えず、コンパイルさえすべきではありません。コンパイルされた場合、 subscribe(new Observer() {... 部分は明らかにイベントストリームをトリガーします。

以下は、Observable が整数を発行し、それらを文字列にマッピングし、それをサブスクライブする Observer の簡単な例です。

Observable<String> myObservable = Observable.just(1, 2, 3, 4).map(new Func1<Integer, String>() {
    @Override
    public String call(Integer integer) {
        return String.valueOf(integer);
    }
});

Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError: " + e.getMessage());
    }

    @Override
    public void onNext(String s) {
        System.out.println("onNext: " +s);
    }
};

myObservable.subscribe(mySubscriber);
于 2016-03-19T21:19:48.443 に答える