RxJava中的Observable.just vs Single

时间:2017-10-12 05:16:07

标签: android rx-java rx-android

我是RxJava和RxAndroid的新手,并尝试了解Observable.justSingle之间的区别。看起来每个都被设计为为其观察者发射一个项目。

这是我的简单Android活动的代码,带有两个按钮。第一个按钮创建Observable,第二个按钮创建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);
                    }
                }));

当我按下“只是”按钮时,会调用onSubscribeonNextonComplete

当我按下“单个”按钮时,只会调用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'

1 个答案:

答案 0 :(得分:3)

您的代码按预期工作。第一个你发射物品而不是第二个。

您需要更改为

 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

中看到错误