我是RxJava和RxAndroid的新手,并尝试了解Observable.just
和Single
之间的区别。看起来每个都被设计为为其观察者发射一个项目。
这是我的简单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);
}
}));
当我按下“只是”按钮时,会调用onSubscribe
,onNext
和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'
答案 0 :(得分: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