私はRxJavaを試していますが、私は対処方法がわからないという小さな問題を発見しました。 私は自分のアプリケーションのGoogleマップのAPIで使用しているので、マップを持つフラグメントが作成されたとき、私はマップを使用する準備ができたとき、これはコールバックメソッドを呼び出しますキャッシュ可能?
mGoogleMapFragment.getMapAsync(OnMapReadyCallback)
を呼び出す必要があります。 RxJavaを使ってマップが準備できていることを伝える素晴らしい場所のように見えます。だから私はこのような何かを開始しました:
mMapReadySignal = Single.<GoogleMap>fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onSuccess(googleMap);
};
getMapAsync(callback);
}).cache();
キャッシュは、複数のサブスクリプションが起こることを禁止すると呼ばれている - 私は一度だけサブスクライブしたいと思います。 - 私はどこでもmMapReadySignalによって返されるオブジェクトを使用しないでください
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 = Completable.fromEmitter(objectEmitter -> {
OnMapReadyCallback callback = googleMap -> {
mMap = googleMap;
objectEmitter.onCompleted();
};
getMapAsync(callback);
});
ここに問題があります。私は完成可能なオブジェクトのキャッシュを呼び出すことができないので、私が終わったのはmMapReadySignalが2回購読されていることです。それは間違いなく私が望むものではありません!このCompletableをキャッシュするにはどうすればよいですか?方法はありますか?
私はこの "moveCamera observable"をcompletableのエミッタ本体に移動することを考えていました。しかし、これは私の問題を解決するものではありません。これはバグの原因となります.mmMapReadySignalへのすべての加入者を削除すると誰もそれを購読しないので、googleMapはカメラなしで終了します。望ましい位置;