Android 缓存一个完全表?

Android 缓存一个完全表?,android,google-maps,rx-java,Android,Google Maps,Rx Java,我正在尝试RxJava,我发现了一个小问题,我不知道如何处理。 我在我的应用程序中使用GoogleMapsAPI,所以当创建带有地图的片段时,我必须调用 mGoogleMapFragment.getMapAsync(OnMapReadyCallback) 这将在映射准备好使用时调用回调方法。看起来是一个很好的地方,可以使用RxJava来表示地图已经准备好了,我可以在上面做一些工作。所以我从这样的事情开始: mMapReadySignal = Single.<GoogleMap&g

我正在尝试RxJava,我发现了一个小问题,我不知道如何处理。 我在我的应用程序中使用GoogleMapsAPI,所以当创建带有地图的片段时,我必须调用

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");
    }
});