我正在尝试RxJava,我发现了一个小问题,我不知道如何处理。我在我的应用程序中使用的是google地图API,所以当创建包含地图的片段时,我必须调用
mGoogleMapFragment.getMapAsync(OnMapReadyCallback)
这将在准备使用map时调用一个回调方法。看起来这是一个很好的地方,可以使用RxJava来表示地图已经准备好了,我可以在上面做一些工作。因此,我从下面的内容开始:
mMapReadySignal = Single.<GoogleMap>fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onSuccess(googleMap);
};
getMapAsync(callback);
}).cache();
调用缓存是为了禁止发生多次订阅-我只想订阅一次。
然后我在另外两个观察点中使用了这个单曲:
mMapReadySignal
.observeOn(AndroidSchedulers.mainThread())
.subscribe((googleMap) -> {
LatLng place = new LatLng(52,0, 20.0);
mMap.moveCamera(CameraUpdateFactory.zoomTo(13.0f));
mMap.moveCamera(CameraUpdateFactory.newLatLng(place));
}));
和
MyRetrofitInterface.getMarkedPlaces()
.zipWith(mMapReadySignal.toObservable(), (markedPlaces, ignore) -> markedPlaces)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
markedPlaces -> showOnMap(markedPlaces),
Throwable::printStackTrace));
看起来不错,但可以看起来更好-我没有使用mMapReadySignal返回的anywhere对象。那么为什么不让它成为一个可完成的呢?
mMapReadySignal = Completable.fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onCompleted();
};
getMapAsync(callback);
});
这是问题所在。我不能在可完成的对象上调用缓存,所以我最终得到的结果是mMapReadySignal被订阅了两次。这绝对不是我想要的!我怎样才能把这个可完备性转换成缓存呢?有什么办法吗?
哦,是的--我一直在考虑将这个"moveCamera可观察性“移动到completable的发射器的主体上。然而,这不是我的问题的解决方案,因为这将为bug创造一个机会-如果我移除所有mMapReadySignal的订户,没有人会订阅它,因此我最终会得到一个没有摄像头移动到我想要的位置的googleMap;
发布于 2017-01-14 17:55:00
因为Completable不会发出任何东西(没有onNext),所以它没有缓存的意义(没有要缓存的事件)。
但是,您可以通过使用Completable.toObservable()方法将Completable传输到Observable,然后使用Observable.cache()缓存此Observable,然后再次将其传输到Completable来实现这一点。您还可以使用操作创建Observable,对其进行缓存,然后使用toCompletable()调用transfer to completable
发布于 2017-01-24 21:45:04
你不应该需要缓存一个可完成的。
final Completable c = Completable.fromAction(new Action0() {
@Override
public void call() {
}
});
c.observeOn(Schedulers.computation()).subscribe(new Action0() {
@Override
public void call() {
Log.d("X", "A");
}
});
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
c.observeOn(Schedulers.io()).subscribe(new Action0() {
@Override
public void call() {
Log.d("X", "B");
}
});
打印“A”,然后在两秒钟后打印“B”。
https://stackoverflow.com/questions/41648929
复制相似问题