2017-07-18 3 views
2

J'utilise ormlite et convertis les données de base de données en rx Observable. J'ai trois classes différentes A, B, C. Dans cette classe, je crée trois observateurs. Je suis abonné à observable. Par la suite, je change les données dans la classe A et met à jour la base de données. Ensuite, je modifie les données dans la classe A et met à jour la base de données. Existe-t-il un moyen de répéter les nouvelles données observables pour tous les observateurs?RxJava2, OrmLite - Un abonné multiple, observable - Répéter les données pour tous les abonnés

Ou dois-je réécrire ce code?

observable.subscribe(observerA); 
observable.subscribe(observerB); 
observable.subscribe(observerC); 

Répondre

0

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.

+0

Son fonctionne parfaitement. Je vous remercie. –