我會使用單獨的BehaviorSubject
和scan
來監視執行狀態。這與實例變量非常相似,但可能會激發您獲得更好的解決方案。事情是這樣的:
private final BehaviorSubject<Integer> mProgressSubject = BehaviorSubject.create(0);
public Observable<String> firstLongRunningOperations() {
return Observable.just("First")
.doOnSubscribe(() -> mProgressSubject.onNext(1))
.finallyDo(() -> mProgressSubject.onNext(-1)));
}
public Observable<String> secondLongRunningOperations() {
return Observable.just("Second")
.doOnSubscribe(() -> mProgressSubject.onNext(1))
.finallyDo(() -> mProgressSubject.onNext(-1));
}
public Observable<Boolean> 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。對不起,我沒有測試它,但它應該工作。
在你的例子中,你可以先在同一個地方訂閱你的按鈕,並且可能使用類似'combineLatest'的東西來獲取它們的事件 – njzk2