编程语言
首页 > 编程语言> > RxJava / Android监视在不同时间触发的多个订阅者的进度

RxJava / Android监视在不同时间触发的多个订阅者的进度

作者:互联网

我正在寻找一种方法,希望使用RxJava来保持一致性,以监视可能在不同时间触发的多个订户的进度.我知道如何从一个方法中将所有用户同时触发后将它们合并或合并在一起,但是我不知道在不同时间从不同方法中触发它们时会采用哪种方法.

例如,如果我有2个长时间运行的任务附加到按钮按下上.我按下按钮1并触发可观察者/用户,在运行的一半途中,我按下按钮2来触发第二个观察者/用户.

我想在没有任务运行时启用按钮,而在一个或多个任务运行时禁用按钮.

这可能吗?我试图避免也设置实例变量标志.

解决方法:

我将使用单独的BehaviorSubject并进行扫描以监视执行状态.这与实例变量非常相似,但可能可以激发您寻求更好的解决方案.像这样:

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.抱歉,我没有对其进行测试,但是应该可以.

标签:rx-java,rx-android,android
来源: https://codeday.me/bug/20191119/2033340.html