在循环中发出值(RxJava)

时间:2017-02-25 13:42:29

标签: java rx-java rx-java2

我是Rx的新手,我一直想知道如何正确地逐个发出值(本例中的延迟加载图像)。 如果没有遇到并发问题,最好的方法是什么?

这是我的代码:

@Override
public Observable<Bitmap> getPhotos(final String placeId) {
    return Observable.create(new ObservableOnSubscribe<Bitmap>() {
        @Override
        public void subscribe(ObservableEmitter<Bitmap> emitter) throws Exception {
            try {
                PlacePhotoMetadataResult res = Places.GeoDataApi
                        .getPlacePhotos(googleApiClient, placeId)
                        .await();
                PlacePhotoMetadataBuffer buffer = res.getPhotoMetadata();

                for (PlacePhotoMetadata photoMetadata : buffer) {
                    Bitmap photo = photoMetadata
                            .getPhoto(googleApiClient)
                            .await()
                            .getBitmap();

                    emitter.onNext(photo);
                }

                buffer.release();
            } catch (Exception ex) {
                emitter.onError(ex);
            } finally {
                emitter.onComplete();
            }
        }
    });
}

谢谢!

1 个答案:

答案 0 :(得分:1)

你真的应该投入一些时间来PendingResult<T>Observable<T>(或SingleFlowable(我的偏好))。然后您的所有代码都可以表示为:

private static <T> Observable<T> toObservable(PendingResult<T> result) {
    // 
}

public Observable<Bitmap> getPhotos(final String placeId) {
    return Observable
            .just(placeId)
            .flatMap(id -> toObservable(Places.GeoDataApi.getPlacePhotos(googleApiClient, placeId)))
            .flatMapIterable(PlacePhotoMetadataResult::getPhotoMetadata)
            .flatMap(metadata -> toObservable(metadata.getPhoto(googleApiClient)))
            .map(Photo::getBitmap);
}

开始研究如何建立桥梁的好地方是this library,但它只是RxJava 1。