Ho un Observable<<List<Foo>> getFoo()
creato da un servizio di riconversione e dopo aver chiamato il metodo .getFoo()
, ho bisogno di condividerlo con più abbonati. Chiamando il metodo .share()
, la chiamata di rete può essere rieseguita. Replay Operator non funziona neanche. So che una potenziale soluzione potrebbe essere .cache()
, ma non so perché questo comportamento è causato.Singolo osservabile con più abbonati
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();
Il codice sopra riportato può riprodurre il comportamento sopra descritto. È possibile eseguire il debug e verificare che gli elenchi ricevuti appartengano a un diverso indirizzo di memoria.
Ho anche considerato ConnectableObservables come una potenziale soluzione, ma questo mi richiede di portare l'osservabile originale in giro e chiamare .connect()
ogni volta che voglio aggiungere un nuovo Sottoscrittore.
Questo tipo di comportamento con .share()
funzionava correttamente fino a Retrofit 1.9. Ha smesso di funzionare su Retrofit 2 - beta. Non l'ho ancora testato con la Retrofit 2 Release Version, rilasciata alcune ore fa.
EDIT: 01/02/2017
Per i lettori futuri, ho scritto un articolo che spiega here di più sul caso!
Grazie per la risposta. Il fatto è che voglio davvero evitare di chiamare ogni volta. Sei sicuro che l'operatore di riproduzione funzionerà correttamente con questo caso d'uso? – Pavlos
In realtà l'ho provato e ha funzionato. Grazie per il vostro tempo e la vostra risposta. Solo per il problema, ho letto la differenza tra gli osservabili caldi e freddi, ma non è riuscito a riprodurli con le chiamate di rete con Retrofit. Se ho usato un Observable.just() l'operatore di condivisione stava lavorando abbastanza bene. – Pavlos