java - 在循环内发出值 (RxJava)

标签 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();
            }
        }
    });
}

谢谢!

最佳答案

你真的应该花一些时间来桥接 PendingResult<T>Observable<T> (或 Single ,或 Flowable (我的偏好))。那么你的所有代码都可以表示为:

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/

相关文章:

java - 如何将 Instagram 媒体对象中的created_at字段值转换为日期

java - 如何在不出现 "No suitable driver found"异常的情况下重新运行 Apache Flink Postgres JDBC 作业

mysql - 如何在 Linux Mint 中使用 OpenJDK 连接 MySQL

java - SerializedSubject 是 RxJava 线程安全所必需的吗

android - 使用 Retrofit 和 Realm 在 RxJava 中纠正流程

java - 从 Kotlin 实现 Java 接口(interface)时出现 NullPointerException

concurrency - 使用 ForkJoinPool.commonPool() 代替 RxJava 的计算调度程序

java - 如何修复闪烁

java - RxJava : How to dynamically emit items from an HTTP response

android - LiveDataReactiveStreams : converting Flowable to LiveData doesn't work