Как вы делаете продолжения с RxJava Observables?
Итак, у меня есть одна асинхронная операция A
это зависит от секунды, B
, Как сделать B продолжением A, как это было бы с тогдашней функцией Javascript Promises или с ContinueWith в.NET TPL?
Давайте возьмем сценарий с Android, где у меня есть две конечные точки службы:
- Один для получения URL для изображения
- Один для получения самого изображения
Код:
private void loadImage(final ImageView imageView) {
Observable<String> stringObs = getImageUrlAsync();
stringObs.subscribe(new Action1<String> () {
@Override
public void call(String imageUrl) {
// First async operation done
Observable<Bitmap> bitmapObs = getBitmapAsync(imageUrl);
bitmapObs.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap image) {
// second async operation done
imageView.setImageBitmap(image);
}
});
}
});
}
Я не хотел бы, чтобы эти две операции были вложенными по коду, а был бы в формате, который читается больше как он действует - последовательно.
Мне не удалось найти что-либо о продолжениях в отношении Observables в RxJava/RxAndroid. Может кто-нибудь, пожалуйста, помогите?
1 ответ
Решение
Я думаю, что вам нужен API flatMap
например:
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("imageUrl");
}
}).flatMap(new Func1<String, Observable<Bitmap>>() {
@Override
public Observable<Bitmap> call(String imageUrl) {
return getBitmapAsync(imageUrl);
}
}).subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap o) {
imageView.setImageBitmap(image);
}
});