android - 如何在Android上阻塞线程一段时间,直到它执行return语句
问题描述
我在 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
异步执行并在完成时调用。尽管如此,在异步语句完成之前,您 returnjsonArray
可能是空的。
您可以简单地在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
...
}
推荐阅读
- javascript - 尝试使用 js、jquery 和 PHP 上传图片时出错
- reactjs - 我无法使用 npx create-react-app 安装反应?
- javascript - Javascript 深拷贝 Squel 对象
- php - PHP:对键相同的子数组的所有值求和
- c# - EF Core 2.2 Scaffold DbContext 并添加 Indetity
- excel - 为什么我在 MAX_USERNAME 上收到错误消息
- java - 如何制作一个读取指令集并分配变量的解释器?
- python - 从 Python 添加 Outlook 联系人
- php - 试图做一个倒数计时器来倒数分钟,直到下一个小时
- xslt - 使用三个源文档进行 XSL 转换以创建报告