2016-08-09 117 views
0

Wie man eine Methode aufruft, nachdem alle anderen Methoden verwirklicht worden sind. Alle Methoden haben Observable.Kettenmethoden auf rxjava

Observable.just("" 
    ) 
      .subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 
      Log.d(TAG, "onCompleted: loading config"); 
      loadConfiguration(); 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(String s) { 
      Log.d(TAG, "onNext: loading data"); 
      initOperatorData(); 
      initCompanyData(); 
      initVehicleData(); 
      initToolsData(); 
     } 
    }); 

private void initCompanyData() { 
    Subscription subscription = db.loadDataMaster() 
      .map(new Func1<RealmResults<DataMaster>, List<String>>() { 
       @Override 
       public List<String> call(RealmResults<DataMaster> dataMasters) { 
        List<String> companies = getCompanyNames(dataMasters); 
        return companies; 
       } 
      }) 
      .subscribe(new Action1<List<String>>() { 
       @Override 
       public void call(List<String> companyNames) { 
        setCompanyNames(companyNames); 
       } 
      });} 

Ich möchte auf die Observablen auf diesen Methoden nennen „OnNext“, sobald sie alle Ende, ich derjenige in onComplete nennen. aber das passiert nicht, weil sie alle asynchron sind. onComplete passiert vor initToolsData.

Gibt es eine Möglichkeit, Aufrufe an Methoden asynchron zu verketten?

Antwort

1

Ich gehe davon aus, dass alle Ihre init* und loadConfiguration Methoden Observable zurückgeben.

In diesem Fall können Sie merge alle Oservable dann concatWith Ihre andere Observable, erstellt von loadConfiguration

Observable.merge(initOperatorData(), initCompanyData(), initVehicleData(), initToolsData()) 
      // I force to cast to Object otherwise, it may not compile, dependings of your methods signatures 
      .cast(Object.class) 
      // you'll subscribe to loadConfiguration when all previous Observable will be completed 
      .concatwith(loadConfiguration()) 
      .subscribe(); 
+0

Danke. Ich habe die Methodenimplementierung hinzugefügt. Ich habe bereits eine Subskription in jeder Methode, wo ich einige Daten einstelle. Was könnte die Lösung dafür sein, da Merge Observables benötigt – Kordova

0

des vereinfachen Lassen versuchen (und entschuldigen Sie die Java 8, macht es Logik viel vernünftiger):

Observable.merge(
     initOperatorData().subscribeOn(Schedulers.io()), 
     initCompanyData() .subscribeOn(Schedulers.io()), 
     initVehicleData() .subscribeOn(Schedulers.io()), 
     initToolsData() .subscribeOn(Schedulers.io())) 
.ignoreElements() 
.doOnComplete(() -> loadConfiguration()) 
.toBlocking() 
.subscribe(); 

private Observable<?> initCompanyData() { 
    return db 
     .loadDataMaster() 
     .doOnNext(dataMasters -> setCompanyNames(getCompanyNames(dataMasters))); 
} 

Viel verständlicher, sagst du nicht? Übrigens, wenn Sie nicht auf die Beendigung der loadConfiguration() Methode warten müssen, können Sie den .toBlocking() Aufruf weglassen. Außerdem sollten Sie den Scheduler computation() verwenden, wenn Sie dies auf Telefonen mit weniger als 4 Kernen ausführen möchten.