2017-03-17 28 views
0

好吧,所以我正在嘗試使用retrofit2實現rxJava2。目標是隻打一次電話並將結果廣播到不同的班級。例如:我在後端有一個geofences列表。我需要在我的MapFragment列表中顯示它們在地圖上,但我也需要這些數據來爲實際觸發器設置pendingIntent服務。Android單個觀察者在單獨的類中有多個用戶

我嘗試下面這個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的兩個不同實例。 share()只適用於實例,而不適用於該方法。如果你想實際分享observable,你必須訂閱相同的實例。您可以與(靜態)成員loadGeofences分享。

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

但請注意不要泄漏Obserable

0

也許它沒有直接回答你的問題,但是我想建議你一些不同的方法:

創建您GeofenceDao一個BehaviourSubject和訂閱您的改造請求這個問題。這一主題將作爲你的客戶和API之間的橋樑,通過這樣做,你將實現:

  1. 響應緩存 - 方便的屏幕旋轉
  2. 重播每一個感興趣的觀察員響應
  3. 客戶和對象之間認購不依賴於主題和API之間的訂閱,因此您可以打破一個而不會破壞另一個
相關問題