RxJava与布尔运算符

时间:2016-11-04 16:34:54

标签: rx-java reactive-programming rx-android greendao

我有两个ObservablesobservableDisconnectContact负责调用删除联系人的API请求,它可以正常运行。如果从数据库中删除了联系人,则第二个observableDeleteContact会发出true或false。我使用greeDao

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

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

我想要两者结合但第二个observable应该在第一个完成时开始并返回true。我考虑使用concat()first()。但我必须知道两个流发出的结果都是真的。所以我使用combineLatest()zip()。但这并不是一个好主意,因为两个流都在同一时间运行。我注意到first()运算符不适用于zip()combineLatest()

如果首先返回false,并且两个流的结果都应该是一个结果,那么如何将第一个流之后的第二个开始的Observables组合起来。

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
                }
            }
        });

3 个答案:

答案 0 :(得分:4)

observableDisconnectContact
        .flatMap(isDisconnectSuccessful -> {
            if(isDisconnectSuccessful) return observableDeleteContact;
            else return Observable.just(false);
         })
         .subscribe(isBothActionsSuccessful -> {
             if(isBothActionsSuccessful) {
                 //success!
             } else {
                 //something goes wrong
             }
         });

答案 1 :(得分: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

,则结果Observable会发出false的结果

答案 2 :(得分:0)

我相信,使用成功和失败的正确语义将使代码更具可读性。我的意思是说使用Completable要么成功完成,要么失败失败。

例如:

Completable observableDisconnectContact = ...;
Completable observableDeleteContact = ...;

observableDisconnectContact
    .andThen(observableDeleteContact)
    .subscribe(new CompletableObserver() {
            @Override
            public void onComplete() {
            }

            @Override
            public void onError(Throwable e) {
            }
        });

注意:由于我没有在任何地方进行测试,因此代码可能无法编译。如果发现任何错误,请进行编辑