web-dev-qa-db-ja.com

Observable.justとRxJavaのシングル

私はRxJavaとRxAndroidを初めて使用し、Observable.justSingleの違いを理解しようとしています。それぞれがオブザーバーに1つのアイテムを放出するように設計されているようです。

これが私の単純なAndroid 2つのボタンを持つアクティビティのコードです。最初のボタンはObservableを作成し、2番目のボタンはSingleを作成します。

findViewById(R.id.just).setOnClickListener(view -> Observable.just("item").subscribe(
        new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(LOG_TAG, "just onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.d(LOG_TAG, "just s=" + s);
            }

            @Override
            public void onError(Throwable e) {
                Log.e(LOG_TAG, "just e=" + e);
            }

            @Override
            public void onComplete() {
                Log.d(LOG_TAG, "just onComplete");
            }
        }));

findViewById(R.id.single).setOnClickListener(
        view -> Single.create((SingleOnSubscribe<String>) e -> {
        })
                .subscribe(new SingleObserver<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(LOG_TAG, "single onSubscribe");
                    }

                    @Override
                    public void onSuccess(String o) {
                        Log.d(LOG_TAG, "single onSuccess");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(LOG_TAG, "single onError", e);
                    }
                }));

「Just」ボタンを押すと、onSubscribeonNext、およびonCompleteが呼び出されます。

「シングル」ボタンを押すと、SingleObserver#onSubscibeのみが呼び出され、SingleObserver#onSuccessは呼び出されません。

Build.gradle内のRxJavaとRxAndroidのバージョン:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
9
Maksim Dmitriev

コードは期待どおりに機能しています。最初のアイテムではアイテムを放出しますが、2番目のアイテムでは放出しません。

に変更する必要があります

_ findViewById(R.id.single).setOnClickListener(
    view -> Single.create((SingleOnSubscribe<String>) e -> {
            if(!e.isDisposed())
            e.onSuccess("item");
    })
            .subscribe(new SingleObserver<String>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.d(LOG_TAG, "single onSubscribe");
                }

                @Override
                public void onSuccess(String o) {
                    Log.d(LOG_TAG, "single onSuccess" + " "+o);
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(LOG_TAG, "single onError", e);
                }
            }));
_

これで、onSuccessに「item」が表示されます。

何らかの操作を実行したいとし、上記のように実行する文字列を返します。操作が失敗したとすると、e.onError(new IOException());)を実行できます。これで、onErrorにエラーが表示されます。

3
Raghunandan