Observable.just 对比 RxJava 中的 Single
Observable.just vs Single in RxJava
我是 RxJava 和 RxAndroid 的新手,正在尝试了解 Observable.just
和 Single
之间的区别。看起来每一个都被设计成为其观察者发射一个项目。
这是我的简单 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" 按钮时,会调用 onSubscribe
、onNext
和 onComplete
。
当我按下 "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
中看到错误
我是 RxJava 和 RxAndroid 的新手,正在尝试了解 Observable.just
和 Single
之间的区别。看起来每一个都被设计成为其观察者发射一个项目。
这是我的简单 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" 按钮时,会调用 onSubscribe
、onNext
和 onComplete
。
当我按下 "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