我是 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/