Как вы делаете продолжения с 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);
        }
    });
Другие вопросы по тегам