Android 缓存一个完全表?
我正在尝试RxJava,我发现了一个小问题,我不知道如何处理。 我在我的应用程序中使用GoogleMapsAPI,所以当创建带有地图的片段时,我必须调用Android 缓存一个完全表?,android,google-maps,rx-java,Android,Google Maps,Rx Java,我正在尝试RxJava,我发现了一个小问题,我不知道如何处理。 我在我的应用程序中使用GoogleMapsAPI,所以当创建带有地图的片段时,我必须调用 mGoogleMapFragment.getMapAsync(OnMapReadyCallback) 这将在映射准备好使用时调用回调方法。看起来是一个很好的地方,可以使用RxJava来表示地图已经准备好了,我可以在上面做一些工作。所以我从这样的事情开始: mMapReadySignal = Single.<GoogleMap&g
mGoogleMapFragment.getMapAsync(OnMapReadyCallback)
这将在映射准备好使用时调用回调方法。看起来是一个很好的地方,可以使用RxJava来表示地图已经准备好了,我可以在上面做一些工作。所以我从这样的事情开始:
mMapReadySignal = Single.<GoogleMap>fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onSuccess(googleMap);
};
getMapAsync(callback);
}).cache();
及
看起来不错,但可以看起来更好-我不使用mMapReadySignal返回的anywhere对象。那么为什么不让它成为一个完整的呢
mMapReadySignal = Completable.fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onCompleted();
};
getMapAsync(callback);
});
这就是问题所在。我不能在一个可完成的对象上调用缓存,所以我最终得到的结果是,mMapReadySignal被订阅了两次。那绝对不是我想要的!如何将此Completable转换为缓存?有办法吗
哦,是的,我一直在考虑将“移动摄影机可观测”移动到completable的发射器主体上。然而,这并不能解决我的问题,因为这会为一个bug创造一个机会——如果我删除所有mMapReadySignal的订阅者,没有人会订阅它,因此我最终会得到一个谷歌地图,而不会将相机移动到我想要的位置 由于Completable不发出任何信息(无onNext),因此它没有缓存的感觉(无需缓存的事件)。
但是,您可以通过使用Completable.toObservable()方法将Completable传输到Observable,然后使用Observable.cache()缓存此Observable,再将其传输到Completable来实现这一点。
您也可以使用操作创建Observable,缓存它,然后使用toCompletable()调用transfer to completable()您不需要缓存completable
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”
mMapReadySignal = Completable.fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onCompleted();
};
getMapAsync(callback);
});
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");
}
});