好的,所以我正在尝试通过Retrofit2实现rxJava2。目标是只拨打一次电话,并将结果广播到不同的班级。例如:我在后端有一个地理围栏列表。我需要MapFragment中的该列表以在地图上显示它们,但我还需要该数据为实际触发器设置未决Intent服务。

我尝试跟随此遮篷,但遇到各种错误:
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);时,每次都在做一个单独的呼叫。谢谢

最佳答案

new GeofenceDao().loadGeofences()返回Observable的两个不同实例。 share()仅适用于实例,不适用于方法。如果要实际共享可观察对象,则必须订阅同一实例。您可以与(静态)成员loadGeofences共享它。

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


但是请注意不要泄漏Obserable

10-01 00:28