2017-01-25 2 views
2

Ich bin mit dem Problem konfrontiert. Soweit ich weiß zip Methode von RxJava wartet auf alle Observablen zu vervollständigen.Rx Java-Zip abgeschlossen, wenn ein Thema abgeschlossen ist

Aber ich bekomme ein anderes Verhalten.

Hier ist mein Code-Snippet

private PublishSubject<Void> firstSubject; 
    private PublishSubject<Void> secondSubject; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     loadData(); 
     mDrawerHeaderView.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // getSecondSubject().onNext(null); 
      } 
     }, 1000); 
     mDrawerHeaderView.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       getFirstSubject().onCompleted(); 
      } 
     }, 1000); 
    } 

    protected PublishSubject<Void> createFirstSubject() { 
     firstSubject = PublishSubject.create(); 
     return firstSubject; 
    } 

    protected PublishSubject<Void> createSecondSubject() { 
     secondSubject = PublishSubject.create(); 
     return secondSubject; 
    } 

    protected PublishSubject<Void> getFirstSubject() { 
     return firstSubject; 
    } 

    protected PublishSubject<Void> getSecondSubject() { 
     return secondSubject; 
    } 

    private void loadData() { 
     Observable<Void> firstSubject = createFirstSubject(); 
     Observable<Void> secondSubject = createSecondSubject(); 
     Observable<Boolean> allDataTask = Observable.zip(firstSubject, secondSubject, new Func2<Void, Void, Boolean>() { 
      @Override 
      public Boolean call(Void aVoid, Void aVoid2) { 
       return true; 
      } 
     }); 
     allDataTask 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<Boolean>() { 
        @Override 
        public void onCompleted() { 
         Notifications.showSuccessMessage(getApplicationContext(), "COMPLETE"); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Notifications.showErrorMessage(getApplicationContext(), "ERROR"); 

        } 

        @Override 
        public void onNext(Boolean aBoolean) { 
         Notifications.showSuccessMessage(getApplicationContext(), "NEXT"); 
        } 
       }); 
    } 

In diesem Fall habe ich COMPLETE Nachricht bekam, aber ich erwartete nichts zu bekommen, weil das zweite Thema nicht abgeschlossen ist. Was mache ich falsch? Bitte helfen Sie mir, das gewünschte Verhalten zu bekommen.

+0

Mögliche Duplikat [Rx Java beobachtbare bis eine Bedingung ausführen] (http://stackoverflow.com/questions/41856356/rx-java-observable-execute-until-some-condition) –

Antwort

3

Ja, es funktioniert as expected. Es macht durchaus Sinn, die onCompleted() hier zu empfangen, denn wenn ein Stream fertig ist, solange alle Elemente, die er ausgibt, "gezippt" sind, gibt es keine Möglichkeit, mehr "zu zippen", also "abgeschlossen". Sie können auch mit der Sequenz here spielen.

+0

Danke für die Antwort, könnten Sie Bitte geben Sie ein Beispiel, wie Sie das gewünschte Ergebnis mit Rx Java erreichen können bitte – brqgddez

+0

Ich möchte warten, bis alle Anfragen abgeschlossen sind – brqgddez

Verwandte Themen