2017-03-17 5 views
0

私はretrofit2でrxJava2を実装しようとしています。目標は、一度だけ電話をかけて結果をさまざまなクラスにブロードキャストすることです。例:バックエンドにジオフェンスのリストがあります。 MapFragmentのリストを地図上に表示する必要がありますが、実際のトリガーにpendingIntentサービスを設定するためにはそのデータも必要です。別のクラスに複数のユーザが参加している単一のオブザーバ

私はこのawnser以下しようとしたが、私はエラーのすべての種類を取得: Single Observable with Multiple Subscribers

現在の状況は以下の通りである:

GeofenceRetrofitEndpoint:

public interface GeofenceEndpoint { 
    @GET("geofences") 
    Observable<List<Point>> getGeofenceAreas(); 
} 

GeofenceDAO:

public class GeofenceDao { 
    @Inject 
    Retrofit retrofit; 
    private final GeofenceEndpoint geofenceEndpoint; 

    public GeofenceDao(){ 
     InjectHelper.getRootComponent().inject(this); 
     geofenceEndpoint = retrofit.create(GeofenceEndpoint.class); 
    } 

    public Observable<List<Point>> loadGeofences() { 
     return geofenceEndpoint.getGeofenceAreas().subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .share(); 
    } 
} 

MapFragment /私は

private void getGeofences() { 
    new GeofenceDao().loadGeofences().subscribe(this::handleGeoResponse, this::handleGeoError); 
} 

private void handleGeoResponse(List<Point> points) { 
    // handle response 
} 

private void handleGeoError(Throwable error) { 
    // handle error 
} 

結果を必要とする他のクラス私が間違って何をやっている、私はnew GeofenceDao().loadGeofences().subscribe(this::handleGeoResponse, this::handleGeoError);呼び出すときには、別の呼び出しを毎回やっているので。 Thx

答えて

1

new GeofenceDao().loadGeofences()は、Observableの2つの異なるインスタンスを返します。 share()はインスタンスにのみ適用され、メソッドには適用されません。実際にオブザーバブルを共有したい場合は、同じインスタンスにサブスクライブする必要があります。あなたはそれを静的なメンバーloadGeofencesと共有することができます。

private void getGeofences() { 
    if (loadGeofences == null) { 
     loadGeofences = new GeofenceDao().loadGeofences(); 
    } 
    loadGeofences.subscribe(this::handleGeoResponse, this::handleGeoError); 
} 

ただし、Obserableが漏れないように注意してください。

0

たぶんそれは直接あなたの質問に答えていないです、しかし私はあなたに少し異なるアプローチを提案したいと思います:

はあなたのGeofenceDaoBehaviourSubjectを作成し、この対象に、あなたの改造要求をサブスクライブします。このテーマは、あなたが達成するこれを行うことによって、あなたの顧客とのAPIの間のブリッジとして機能します:

  1. 応答キャッシュ - 便利なクライアントと被写体の間のすべての興味を持ってオブザーバ
  2. サブスクリプションのための応答をリプレイ画面回転
  3. のためにサブジェクトとAPI間のサブスクリプションに依存しないため、別のサブセクションを破ることなく1つを破ることができます
関連する問題