ksa*_*tis 1 android retrofit2 rx-java2
我想执行以下操作.我有一个事务列表,我希望通过为每个事务发出2个api请求(我正在使用retrofit2)来更新,然后将结果保存到数据库中(使用观察者).经过一些搜索,我决定使用zip运算符来组合2个请求,但我遇到的问题是我无法确定整个过程何时完成更新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() {
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经更新了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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |