【发布时间】:2020-08-20 07:37:19
【问题描述】:
我有一个场景,我想为多个设备调用相同的 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 吗?
有什么建议/帮助吗?
【问题讨论】:
标签: android retrofit2 rx-java rx-android