在RxJava中的Observable.just vs Single

Mak*_*iev 8 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);
                    }
                }));
Run Code Online (Sandbox Code Playgroud)

当我按下"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'
Run Code Online (Sandbox Code Playgroud)

Rag*_*dan 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);
                }
            }));
Run Code Online (Sandbox Code Playgroud)

现在您应该在 中看到“item” onSuccess

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

  • `Single.create()` javadoc 甚至有一个示例:http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Single.html#create-io.reactivex.SingleOnSubscribe- (2认同)