android - 如何使用 RxJava2 基于条件执行并行进程
问题描述
我正在尝试在我当前的 Android 项目中使用 RxJava2。
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
我有许多遵循这种模式的用例。
1). Check a condition is true or false.
2). When condition is true
2.1). Execute multiple processes in parallel
2.2). wait until all parallel process have completed.
3). When condition is false.
3.1). Do nothing.
一个这样的用例是我检查我的本地数据库是否需要从远程源刷新。
我已经走了这么远,现在我被困住了......
refreshRequired().subscribeOn(Schedulers.io()).subscribe(getObserver());
有问题的方法类似于:-
/**
*
* @return
*/
private Single<Boolean> refreshRequired() {
return Single.create(new SingleOnSubscribe<Boolean>() {
@Override
public void subscribe(final SingleEmitter<Boolean> emitter) {
if (emitter.isDisposed()) {
} else {
emitter.onSuccess(isRefreshRequired());
}
}
});
}
/**
*
* @return
*/
private SingleObserver<Boolean> getObserver() {
return new SingleObserver<Boolean>() {
@Override
public void onSubscribe(final Disposable disposable) {
}
@Override
public void onSuccess(final Boolean value) {
Log.d(TAG, "onSuccess() called with: value = [" + value + "]");
}
@Override
public void onError(final Throwable throwable) {
Log.e(TAG, "onError() called with: ", throwable);
}
};
}
我无法理解的是当public void onSuccess(final Boolean value) {}
方法接收到值时如何触发我的并行进程true
这个过程的伪代码是:-
When refreshRequired
Refresh Data A
Refresh Data B
Refresh Data C
Stop
Otherwise
Stop
解决方案
您可以通过使用filter
运算符将反应流分成两部分来实现:
Observable<Boolean> refreshRequiredObservable = refreshRequired();
refreshRequiredObservable.filter(refreshRequired -> refreshRequired)
.doOnNext(aBoolean -> System.out.println("Do first thing"))
.doOnNext(aBoolean -> System.out.println("Do second thing"))
.doOnNext(aBoolean -> System.out.println("Do third thing"))
.subscribe();
refreshRequiredObservable.filter(refreshRequired -> !refreshRequired)
.doOnNext(aBoolean -> System.out.println("Do nothing"))
.subscribe();
推荐阅读
- javascript - 如何使用 JavaScript 从另一个函数中停止 array.some()?
- excel - 另一个宏仅适用于调试步骤模式问题
- java - 如何在不使用第三方的情况下使用 Java 将多个图像转换为单个 tiff 文件?(也不能使用Image.io)
- java - 如何将列表中的 XML 元素添加到 XMLEventWriter 中?将 XML 附加到已创建的 XMLEventWriter/XmlStreamWriter
- url - 如何知道我们是否需要在 burpsuite 中对 url 进行双重编码
- c - 显示外部功能输出
- amazon-web-services - AWS 日志按请求分组
- visual-studio-code - 当我已经在 VSCode 上为 Salesforce 开发授权开发中心时,“未设置默认开发中心”
- r - 如何在 Linux 终端中将 ctrl-shift-m 映射到 %>%?
- vba - VBA使用映射表根据标题将值从一张表复制到另一张表