2016-11-04 28 views
3

我有两个ObservablesobservableDisconnectContact负责调用删除联系人的API请求并正常工作。如果联系人已从数据库中删除,则第二个observableDeleteContact会发出真或假。我使用greeDaoRxJava结合布尔运算符

Observable<Boolean> observableDisconnectContact = apiClient.observableDisconnectContact(contactModel.getId()) 

Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId()) 

我想结合两者,但第二个observable应该在第一个完成时启动并返回true。我想使用concat()first()。但我必须知道,这两种流都会发出结果是真的。所以我使用combineLatest()zip()。但是,由于两个流都在同一时间运行,这不是一个好主意。我注意到first()运营商不适用于zip()combineLatest()

如何结合两个Observables第二次启动后第一个流是否如果第一个返回false和两个流的结果应作为一个结果。

Observable.combineLatest(observableDisconnectContact, observableDeleteContact, new Func2<Boolean, Boolean, Boolean>() { 
      @Override 
      public Boolean call(Boolean isDisconnectSuccess, Boolean isRemoveSuccess) { 
       return isDisconnectSuccess && isRemoveFromDatabaseSuccess; 
      } 
     }).subscribe(new Subscriber<Boolean>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onNext(Boolean isDeleted) { 
       if (isDeleted) { 
        //TODO 
       } 
      } 
     }); 

回答

4
observableDisconnectContact 
     .flatMap(isDisconnectSuccessful -> { 
      if(isDisconnectSuccessful) return observableDeleteContact; 
      else return Observable.just(false); 
     }) 
     .subscribe(isBothActionsSuccessful -> { 
      if(isBothActionsSuccessful) { 
       //success! 
      } else { 
       //something goes wrong 
      } 
     }); 
1
observableDisconnectContact 
    .filter(new Func1<Boolean, Boolean>() { 
     @Override 
     public Boolean call(Boolean aBoolean) { 
      return aBoolean; 
     } 
    }) 
    .flatMap(new Func1<Object, Observable<Boolean>>() { 
     @Override 
     public Observable<Boolean> call(Object o) { 
      return observableDeleteContact; 
     } 
    }); 

导致可观察将发射observableDeleteContact的结果。如果observableDisconnectContact发射true和过滤器(未发射任何东西),如果它是false

+0

这几乎是很好。如果'observableDisconnectContact'发出false,它就被称为'onComplited()'。是否有可能发布虚假? – Michael

+0

@迈克尔是可能的,请检查我的答案 –