android - RXJava。确定 for 循环内的所有 obervables 何时完成

标签 android retrofit2 rx-java2

我想执行以下操作。我有一个交易列表,我想通过为每个交易发出 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 循环时,你应该考虑 rangefromArrayfromIterable。此外,您可能不需要完整的 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/

相关文章:

android - RX JAVA + Retrofit sdk 使用 Swagger codegen 生成

java - RxJava2 中的条件完成

rx-java - RxJava2 : PublishProcessor callbacks for the first subscribed and the last unsubscribed observer

java - 平稳移动物体,性能差

c# - 如何使用 xamarin for visual studio 切换到另一个页面?

android - 不显示 toast 消息 android

generics - 为什么我不能在这个 Rx 转换器中使用接口(interface)作为泛型类型?

java - Toast 名称以及距离 map 中心最近的城市的距离

android - 使用改造和 Moshi 解析 api 响应不完全 "json"

java - API 声明必须是接口(interface) - Retrofit