У меня есть Observable<<List<Foo>> getFoo()
, который создается из Retrofit Service и после вызова
.getFoo()
, мне нужно поделиться им с несколькими подписчиками. Однако вызов метода .share()
приводит к повторному исполнению сетевого вызова. Оператор воспроизведения не работает. Я знаю, что потенциальное решение может быть .cache()
, но я не знаю, почему это поведение вызвано.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
// Create an instance of our GitHub API interface.
// Create a call instance for looking up Retrofit contributors.
Observable<List<Contributor>> testObservable = retrofit
.create(GitHub.class)
.contributors("square", "retrofit")
.share();
Subscription subscription1 = testObservable
.subscribe(new Subscriber<List<Contributor>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(List<Contributor> contributors) {
System.out.println(contributors);
}
});
Subscription subscription2 = testObservable
.subscribe(new Subscriber<List<Contributor>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(List<Contributor> contributors) {
System.out.println(contributors + " -> 2");
}
});
subscription1.unsubscribe();
subscription2.unsubscribe();
Приведенный выше код может воспроизвести вышеупомянутое поведение. Вы можете отладить его и увидеть, что полученные списки принадлежат другому MemoryAddress.
Я также рассматривал ConnectableObservables как потенциальное решение, но для этого требуется, чтобы я носил оригинал, наблюдаемый вокруг, и вызывал .connect()
каждый раз, когда я хочу добавить нового Абонента.
Такое поведение с .share()
работало нормально до Retrofit 1.9. Он перестал работать на Retrofit 2 - beta. Я еще не тестировал его с версией Retrofit 2 Release, которая была выпущена несколько часов назад.
EDIT: 01/02/2017
Для будущих читателей я написал статью здесь, объясняющую больше об этом случае!