Disclaimer: Je n'ai pas l'expérience directe avec RxJava, seulement Rx.NET, RxJS et RxSwift (et je ne l'ai pas fait dev Java dans 10 ans)
D'abord, je vous recommande en utilisant l'opérateur share()
sur l'observable avant de s'abonner. Cela fait en sorte que vous ne faites pas de travail supplémentaire:
Observable<List<Country>> sharedObservable = observable.share();
sharedObservable.subscribe(observerA);
sharedObservable.subscribe(observerB);
sharedObservable.subscribe(observerC);
Un observable est un flux de données. À l'heure actuelle, il ne contient qu'une seule valeur, mais vous pouvez le faire retourner plusieurs valeurs. Tous les abonnés recevront bien sûr les nouvelles valeurs entrant.
Vous devrez notifier que les données ont été mises à jour, puis générer une nouvelle valeur lorsque cela se produit. Un moyen facile de créer des valeurs dans un observable arbitrairement est d'utiliser un Subject
. Les sujets sont un peu « un-Rx-y », mais pour des raisons de simplicité, je vais utiliser un ici:
// All this inside the same class
private PublishSubject<Object> updatesSubject = new PublishSubject<Object>();
public void SignalUpdate(){
updatesSubject.onNext(new Object());
}
public Observable<List<Country>> getCountriesObservable() {
return updatesSubject
.startWith(new Object)
.flatMap(_ -> RxUtils.createObservable(new Observable<List<Country>>() {
@Override
protected void subscribeActual(Observer<? super List<Country>> observer) {
try {
List<Country> list = mCountryDao.getCountries();
observer.onNext(list == null ? Collections.<Country>emptyList() : list);
observer.onComplete();
} catch (SQLException exc) {
Log.e(TAG, exc.getMessage());
observer.onError(exc);
}
}
});
}
Cela renverra un List<Country>
chaque fois signalUpdate()
est appelé. Pour vous assurer que vous obtiendrez de la valeur lors de votre première inscription, nous appelons le startWith()
qui émet immédiatement la valeur donnée et lance le premier chargement des données.
Son fonctionne parfaitement. Je vous remercie. –