2017-01-14 11 views
1

私は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はカメラなしで終了します。望ましい位置;

答えて

1

Completableは何も出力しません(onNextはありません)。キャッシュには意味がありません(キャッシュするイベントはありません)。
ただし、Completable.toObservable()メソッドを使用してObservableにObservableを転送すると、Observable.cache()を使用してこのObservableをキャッシュし、Completableに再度転送するよりも、これを実現できます。 Observableを操作で作成してキャッシュし、toCompletable()を使用して完了できるように転送することもできます。

0

完成品をキャッシュする必要はありません。

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」、その後2秒後に「B」が印刷されます。

関連する問題