我想执行以下操作。我有一个交易列表,我想通过为每个交易发出 2 个 api 请求(我正在使用 retrofit2)来更新它,然后将结果保存到数据库中(使用观察者)。经过一番搜索后,我决定使用 zip 运算符来合并这两个请求,但我遇到的问题是我无法确定整个过程何时完成以更新 UI。代码如下所示。
for (Transaction realmTransaction : allTransactions) {
Observable<Map<String, String>> obs1 = getObs1(realmTransaction);
Observable<Map<String, String>> obs2= getObs2(realmTransaction);
Observable.zip(obs1, obs2,
(map1, map2) -> {
Map<String, String> combined = new HashMap<>();
// do some processing and return a single map after
return combined;
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(realmTransaction));
}
public Observer<Map<String, String>> getObserver(Transaction t){
return new Observer<Map<String, String>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Map<String, String> stringStringMap) {
// update database
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
}
我拥有的观察者更新了 realmTransaction 对象的一个字段。
我的问题是如何在 for 循环结束时收到通知?
我想在整个过程完成后发送一个事件(可能使用 EventBust)以启动其他方法。
谢谢
还有一个小问题是关于我在 zip 运算符中提供的功能,我如何指定该功能将在哪个线程上运行?我想为此使用一个计算线程,这就是为什么我将 observeOn 放了两次,但我无法在任何地方找到答案
最佳答案
每当你有一个 for 循环时,你应该考虑 range
、fromArray
或 fromIterable
。此外,您可能不需要完整的 subscribe
但需要 doOnNext()
:
Observable.fromIterable(allTransactions)
.flatMap(realmTransaction -> {
Observable<Map<String, String>> obs1 = getObs1(realmTransaction);
Observable<Map<String, String>> obs2= getObs2(realmTransaction);
return Observable.zip(obs1, obs2, (map1, map2) -> {
Map<String, String> combined = new HashMap<>();
// do some processing and return a single map after
return combined;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(stringStringMap -> handle(stringStringMap, realmTransaction));
})
.ignoreElements()
.subscribe(() -> handleCompleted(), e -> handleError(e));
关于android - RXJava。确定 for 循环内的所有 obervables 何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48736411/