我试过跟随这个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
答案 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之间的桥梁,通过这样做您将实现: