我是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();
            }
        }
    });
}


谢谢!

最佳答案

您确实应该花一些时间将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。

关于java - 在循环内发射值(RxJava),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42456824/

10-15 18:58