Observable.just 对比 RxJava 中的 Single

Observable.just vs Single in RxJava

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

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

当我按下 "Just" 按钮时,会调用 onSubscribeonNextonComplete

当我按下 "Single" 按钮时,只有 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'

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

您需要更改为

 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"。

说你想做一些操作然后 return 你会按照上面的建议做的字符串。假设您的操作失败,您可以执行 e.onError(new IOException());) ,现在您应该会在 onError

中看到错误