私はRxJavaとRxAndroidを初めて使用し、Observable.just
とSingle
の違いを理解しようとしています。それぞれがオブザーバーに1つのアイテムを放出するように設計されているようです。
これが私の単純なAndroid 2つのボタンを持つアクティビティのコードです。最初のボタンはObservable
を作成し、2番目のボタンは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
が呼び出されます。
「シングル」ボタンを押すと、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'
コードは期待どおりに機能しています。最初のアイテムではアイテムを放出しますが、2番目のアイテムでは放出しません。
に変更する必要があります
_ 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
にエラーが表示されます。