我将使用单独的BehaviorSubject并进行扫描以监视执行状态.这与实例变量非常相似,但可能可以激发您寻求更好的解决方案.像这样:
private final BehaviorSubject mProgressSubject = BehaviorSubject.create(0);
public Observable firstLongRunningOperations() {
return Observable.just("First")
.doOnSubscribe(() -> mProgressSubject.onNext(1))
.finallyDo(() -> mProgressSubject.onNext(-1)));
}
public Observable secondLongRunningOperations() {
return Observable.just("Second")
.doOnSubscribe(() -> mProgressSubject.onNext(1))
.finallyDo(() -> mProgressSubject.onNext(-1));
}
public Observable isOperationInProgress() {
return mProgressSubject.asObservable()
.scan((sum, item) -> sum + item)
.map(sum -> sum > 0);
}
用法如下:
isOperationInProgress()
.subscribe(inProgress -> {
if (inProgress) {
//disable controls
} else {
//enable controls
}
});
使用这种方法,您可以进行许多长时间运行的操作,而不必全部解雇.只是不要忘记调用doOnSubscribe和finallyDo.
PS.抱歉,我没有对其进行测试,但是应该可以.