Java 在不同的类中具有多个订阅者的Android单观察者

Java 在不同的类中具有多个订阅者的Android单观察者,java,android,retrofit,rx-java,observer-pattern,Java,Android,Retrofit,Rx Java,Observer Pattern,好的,我正在尝试用rxJava2实现rxJava2。目标是只打一次电话,并将结果广播给不同的班级。对于exmaple:我的后端有一个GeoFence列表。我需要MapFragment中的列表来在地图上显示它们,但我也需要这些数据来为实际触发器设置PendingEvent服务 我试着遵循这一点,但我得到了各种各样的错误: 目前的情况如下: GeoFenceEndpoint: public interface GeofenceEndpoint { @GET("geofences")

好的,我正在尝试用rxJava2实现rxJava2。目标是只打一次电话,并将结果广播给不同的班级。对于exmaple:我的后端有一个GeoFence列表。我需要MapFragment中的列表来在地图上显示它们,但我也需要这些数据来为实际触发器设置PendingEvent服务

我试着遵循这一点,但我得到了各种各样的错误:

目前的情况如下:

GeoFenceEndpoint:

public interface GeofenceEndpoint {
    @GET("geofences")
    Observable<List<Point>> getGeofenceAreas();
}
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();
    }
}
公共接口GeofenceEndpoint{
@获取(“地理围栏”)
可观察区域();
}
GeofenceDAO:

public interface GeofenceEndpoint {
    @GET("geofences")
    Observable<List<Point>> getGeofenceAreas();
}
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();
    }
}
公共类GeofenceDao{
@注入
改造;
专用最终GeofenceEndpoint GeofenceEndpoint;
公共地理围栏(){
InjectHelper.getRootComponent().Injecte(此);
geofenceEndpoint=reformation.create(geofenceEndpoint.class);
}
公共可观测负荷地理围栏(){
返回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
}
private void getgeofenses(){
新建GeofenceDao().loadGeofences().subscribe(this::handleGeoResponse,this::handleGeoError);
}
私有无效handleGeoResponse(列表点){
//处理响应
}
私有无效handleGeoError(可丢弃错误){
//处理错误
}
我做错了什么,因为当我调用
newGeoFenceDao().loadGeofences().subscribe时(this::handleGeoResponse,this::handleGeoError)它每次都进行单独的调用。Thx

新建GeofenceDao()。loadGeofences()
返回可观察的
的两个不同实例<代码>共享()
仅适用于实例,而不适用于方法。如果您想要实际共享可观察对象,您必须订阅相同的实例。您可以与一个(静态)成员
loadGeofences
共享它

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

但是小心不要泄露
可观察的内容

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

在您的
GeofenceDao
中创建一个
Behavior主题
,并向该主题订阅您的改装请求。本课程将作为客户和api之间的桥梁,通过这样做,您将实现:

  • 响应缓存-方便屏幕旋转
  • 为每个感兴趣的观察者回放响应
  • 客户端和主题之间的订阅不依赖于主题和API之间的订阅,所以您可以在不破坏另一个的情况下破坏其中一个