如何在Android上阻塞线程一段时间直到它执行return语句
Posted
技术标签:
【中文标题】如何在Android上阻塞线程一段时间直到它执行return语句【英文标题】:How to block a thread for some time until it executes the return statement, on Android 【发布时间】:2019-12-10 04:58:30 【问题描述】:我在 for 循环下发出多个网络请求。我希望在所有网络调用完成后执行for循环之后的return语句。
我在 Java 中尝试过 Obsever.fromIterable
,在 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 语句之后返回媒体详细信息对象,但它甚至在所有网络调用完成之前就被执行
【问题讨论】:
你试过.blockingGet()
吗?
没有这个函数有什么作用?
阻塞直到 observable 完成发射 (onComplete)。
尽管您甚至不应该在Observable
的范围之外拥有jsonArray
。
Although you shouldn't even have a jsonArray outside of the Observable's scope itself.
-----为什么?
【参考方案1】:
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
...
【讨论】:
嘿,我想将其添加到mediaDetails
对象,然后在此代码末尾返回 mediaDetails
将期望返回值的块添加到您的问题中。
谢谢我已添加
我看不到您帖子中的任何更改...您当前的帖子是返回 jsonArray
的方法块。因此,将期望返回的jsonArray
或调用方法块的语句行或代码块添加到您的帖子中。我相信它应该类似于 Array以上是关于如何在Android上阻塞线程一段时间直到它执行return语句的主要内容,如果未能解决你的问题,请参考以下文章
PixelBuffer对象和Android上的glReadPixel(ARCore)阻塞