我在 for 循环下发出多个网络请求。我希望在所有网络调用完成后执行 for 循环后的 return 语句。
我已经尝试Obsever.fromIterable
Java 并在doOnNext
中更新了要返回的值,但问题是我无法从doOnNext
返回值。我必须从此代码返回mediadetails
对象
// Add some value to the JSON object (mediaDetails) using network calls
try {
// Gets an array list
Observable.fromIterable((ArrayList<LinkedTreeMap>) statements.get("P180"))
.map(item -> {
//extract id from the item
getLabelForDepiction(id).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<JsonObject>() {
@Override
public void accept(JsonObject jsonObject) throws Exception {
jsonArray.add(jsonObject);
}
});
return jsonArray;
})
.doOnNext(subscriber -> {
// Again update media details object
mediaDetails.add("Depiction", (JsonArray) subscriber);
})
} catch (Exception e) {
// Handle exception
}
我想在 catch 语句之后返回媒体详细信息对象,但它甚至在所有网络调用完成之前就被执行了
>getLabelForDepiction(id).subscribeOn
异步执行,并在完成后调用accept
。尽管如此,您返回的jsonArray
在异步语句完成之前可能为空。
您只需在回调中添加方法调用accept
以便在 jsonObject 准备就绪时使用,而不是返回值。
.subscribe(new Consumer<JsonObject>() {
@Override
public void accept(JsonObject jsonObject) throws Exception {
//jsonArray.add(jsonObject);
useJsonObject(jsonObject);
}
});
public void useJsonObject(JsonObject jsonObject){
...
jsonArray.add(jsonObject);
//then make use of jsonArray here
...
}