【问题标题】:Observable.just vs Single in RxJavaRxJava 中的 Observable.just 与 Single
【发布时间】:2017-10-12 05:16:07
【问题描述】:

我是 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'

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    您的代码按预期工作。第一个发出项目,但第二个不发出。

    你需要改成

     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 中看到“项目”。

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

    【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2019-07-05
    • 2018-06-08
    • 2015-11-17
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多