如何在Retrofit,RxJava,Android中从所有请求发出多个请求和响应

问题描述

我有一种情况,我想为多个设备调用相同的API,并在完成所有请求后显示结果。 我正在使用改造2。 我对RxJava知之甚少。我认为zip运算符将适合于此。如此实现。

ApiInterface中的API:

@PUT(AppConstants.BASE_URL + AppConstants.PATH_SEPARATOR + "/user/endpoint")
Observable<ResponseBody> updateInfo(@Header("Authorization") String token,@Query("device_id") String deviceId,@Body JsonObject body);

这里是调用API的方法。它在Map中获取设备ID及其主体。此方法为Map中可用的每个设备ID调用API。

public void updateAllInfo(final HashMap<String,String> deviceIdMap,final ApiResponseListener listener) {

    List<Observable<ResponseBody>> requests = new ArrayList<>();
    ArrayList<String> reqIdList = new ArrayList<>();

    for (Map.Entry<String,String> entry : map.entrySet()) {

        String deviceId = entry.getKey();
        String jsonBodyStr = entry.getValue();
        Gson gson = new Gson();
        JsonObject jsonBody = gson.fromJson(jsonBodyStr,JsonObject.class);

        reqIdList.add(deviceId);
        requests.add(apiInterface.updateSchedules("accessToken",deviceId,jsonBody));
    }

    Observable.zip(requests,new Function<Object[],List<ResponseBody>>() {

        @Override
        public List<ResponseBody> apply(Object[] objects) throws Exception {

            Log.e("onSubscribe","apply : " + objects.length);
            List<ResponseBody> dataResponses = new ArrayList<>();
            for (Object o : objects) {
                dataResponses.add((ResponseBody) o);
            }
            return dataResponses;
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<List<ResponseBody>>() {

                @Override
                public void accept(List<ResponseBody> responseBodies) throws Exception {
                    Log.e("onSubscribe","YOUR DATA IS HERE: " + responseBodies.size());
                    for (int i = 0; i < responseBodies.size(); i++) {
                        Log.e(TAG,"Response received for " + i + " is : " + responseBodies.get(i).string());
                    }
                }
            },new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    Log.e("onSubscribe","Throwable: " + throwable);
                }
            });
}

我想获取每个设备ID的响应(成功/失败)。意味着我需要响应以及需要为其调用API的ID。 使用zip运算符,如果任何API失败,则通过accept(Throwable throwable)方法接收到失败。如果任何API失败,我认为zip运算符不会调用下一个API。

如何获得所有请求的响应(成功或失败)?

还需要一些指示响应的信息来显示结果的请求/设备ID(某些映射)。

还有其他可以代替zip的运算符吗?

有什么建议/帮助吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)