【问题标题】:Multiple retrofit2 requests merged on hashmap with rxJava2使用 rxJava2 在 hashmap 上合并多个retrofit2 请求
【发布时间】:2017-07-14 00:53:52
【问题描述】:

我有一个对象列表:ArrayList<T> arrayList;,并且在列表的每个对象上都有一个 ID:T.getId(),我需要它来发出请求。作为响应,将获取另一个对象列表:ArrayList<E> anotherList

我想根据 id 进行多次调用:T.getId() 并且在每个响应上,我想将该对象:T 与响应:ArrayList<E> anotherList 合并到哈希图上:Hashmap<T, ArrayList<E> anotherList> 并返回之后的值所有请求都已完成。有没有办法使用rxJava 实现这一点?:

//For every `T.getId()`, fetch `ArrayList<E> anotherList` 
for(int i=0; i<arrayList.size(); i++){
    T object = arrayList.get(i);
    fetchData(T.getId());
}

在每个onNext() 上合并(hashmap.put())T 并在Hashmap&lt;T, ArrayList&lt;E&gt; anotherList&gt; 上响应ArrayList&lt;E&gt; anotherList。在所有请求完成后返回包含这些对的最终 hashmap

retrofit.fetchData(T.getId())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap(...)
        .merge(...)
        .subscribeWith(...)

有什么方法可以实现吗?

【问题讨论】:

    标签: java android retrofit2 rx-android rx-java2


    【解决方案1】:

    我认为您可以创建一个字段: private HashMap&lt;Integer,ArrayList&lt;E&gt;&gt; mHashMap;

    此字段实例化后,您可以尝试:

    Observable.just(arrayList)
                    .flatMapIterable(new Function<ArrayList<T>, Iterable<? extends T>>() {
                        @Override
                        public Iterable<? extends T> apply(ArrayList<T> ts) throws Exception {
                            return ts;
                        }
                    }).flatMap(new Function<T, ObservableSource<Hashmap<T,ArrayList<E>>>>() {
                        @Override
                        public ObservableSource<Hashmap<T,ArrayList<E>>> apply(T t) throws Exception {
                            return Observable.fromCallable(new Callable<Hashmap<T,ArrayList<E>>>() {
                                @Override
                                public Hashmap<T,ArrayList<E>> call() throws Exception {
                                    mHashMap.put(t, fetchData(t.getId()));
                                    return mHashMap;
                                }
                            });
                        }
                    });
    

    flatMapIterable 用于获取arrayListflatMap 的每个项目,允许您使用每个项目来创建您需要的相关可观察对象。

    然后使用 DisposableObserver 在 onNext 回调中获取中间完成的 HashMap&lt;Integer,ArrayList&lt;E&gt;&gt; 并在 onCompleted 回调中获取完全完成的 HashMap

    希望这会有所帮助。

    对不起我的英语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多