Android Single观察者,在不同的类中有多个订阅者

时间:2017-03-17 10:53:58

标签: java android retrofit rx-java observer-pattern

好的,所以我正在尝试用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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

也许它没有直接回答你的问题,但是我想建议你采用一种不同的方法:

&中创建BehaviourSubject,并为此主题订阅您的改装请求。这个主题将充当您的客户和api之间的桥梁,通过这样做您将实现:

  1. 响应缓存 - 方便屏幕旋转
  2. 为每个感兴趣的观察者重播回复
  3. 客户与主题之间的订阅不依赖于主题和API之间的订阅,因此您可以打破一个而不会破坏另一个