RxJava 结合布尔运算符
RxJava combine with boolean operators
我有两个Observables
。 observableDisconnectContact
负责调用 API 请求删除联系人并且它工作正常。如果联系人已从数据库中删除,第二个 observableDeleteContact
会发出 true 或 false。我使用 greeDao
.
Observable<Boolean> observableDisconnectContact = apiClient.observableDisconnectContact(contactModel.getId())
Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId())
我想将两者结合起来,但是第二个 observable 应该在第一个完成并且 return 正确时开始。我考虑使用 concat()
和 first()
。但我必须知道这两个流发出的结果都是真实的。所以我使用 combineLatest()
或 zip()
。但这不是好主意,因为两个流同时 运行。我注意到 first()
运算符不适用于 zip()
和 combineLatest()
.
如果第一个 return 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
}
}
});
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;
}
});
Resulted Observable 将在 observableDisconnectContact
发出 true
时发出 observableDeleteContact
的结果,如果 false
则过滤(不发出任何东西)
observableDisconnectContact
.flatMap(isDisconnectSuccessful -> {
if(isDisconnectSuccessful) return observableDeleteContact;
else return Observable.just(false);
})
.subscribe(isBothActionsSuccessful -> {
if(isBothActionsSuccessful) {
//success!
} else {
//something goes wrong
}
});
我相信使用正确的成功和失败语义会使代码更具可读性。我的意思是使用 Completable
要么在成功时完成,要么在失败时发出错误。
例如:
Completable observableDisconnectContact = ...;
Completable observableDeleteContact = ...;
observableDisconnectContact
.andThen(observableDeleteContact)
.subscribe(new CompletableObserver() {
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
});
注意:代码可能无法编译,因为我没有在任何地方对其进行测试。如有错误请修改
我有两个Observables
。 observableDisconnectContact
负责调用 API 请求删除联系人并且它工作正常。如果联系人已从数据库中删除,第二个 observableDeleteContact
会发出 true 或 false。我使用 greeDao
.
Observable<Boolean> observableDisconnectContact = apiClient.observableDisconnectContact(contactModel.getId())
Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId())
我想将两者结合起来,但是第二个 observable 应该在第一个完成并且 return 正确时开始。我考虑使用 concat()
和 first()
。但我必须知道这两个流发出的结果都是真实的。所以我使用 combineLatest()
或 zip()
。但这不是好主意,因为两个流同时 运行。我注意到 first()
运算符不适用于 zip()
和 combineLatest()
.
如果第一个 return 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
}
}
});
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;
}
});
Resulted Observable 将在 observableDisconnectContact
发出 true
时发出 observableDeleteContact
的结果,如果 false
observableDisconnectContact
.flatMap(isDisconnectSuccessful -> {
if(isDisconnectSuccessful) return observableDeleteContact;
else return Observable.just(false);
})
.subscribe(isBothActionsSuccessful -> {
if(isBothActionsSuccessful) {
//success!
} else {
//something goes wrong
}
});
我相信使用正确的成功和失败语义会使代码更具可读性。我的意思是使用 Completable
要么在成功时完成,要么在失败时发出错误。
例如:
Completable observableDisconnectContact = ...;
Completable observableDeleteContact = ...;
observableDisconnectContact
.andThen(observableDeleteContact)
.subscribe(new CompletableObserver() {
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
});
注意:代码可能无法编译,因为我没有在任何地方对其进行测试。如有错误请修改