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