RXJava.确定for循环内的所有obervable何时完成

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放两次,但我无法在任何地方找到答案

aka*_*okd 6

每当你有一个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)