如何在 Android 上阻止线程一段时间,直到它执行 return 语句



我在 for 循环下发出多个网络请求。我希望在所有网络调用完成后执行 for 循环后的 return 语句。

我已经尝试Obsever.fromIterableJava 并在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
...
}