RxJava中的Observable.just和Single有什么区别?

11

我是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);
                    }
                }));

当我按下“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'
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"。

假设你想进行一些操作,然后返回一个字符串,你可以按照上面的建议执行。如果你的操作失败了,那么你可以执行e.onError(new IOException());,现在你应该在onError中看到错误信息。


好的,谢谢。但归根结底,它们都是设计用来发出一个事件的,对吧? - Maksim Dmitriev
@MaksimDmitriev 请查看文档,我认为文档有更好的解释。https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0。 - Raghunandan
1
@MaksimDmitriev 是的。 这取决于您需要在哪些情况下使用Observable / Flowable / Single / Maybe / Completable。 请检查此处使用RxJava与Room的用例示例 https://medium.com/google-developers/room-rxjava-acb0cd4f3757 - Raghunandan
2
Single.create() 的 javadoc 甚至有一个例子:http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Single.html#create-io.reactivex.SingleOnSubscribe- - akarnokd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接