如何在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 blahblah = getJsonArray(); 其中 getJsonArray() 是您在当前问题中发布的代码

以上是关于如何在Android上阻塞线程一段时间直到它执行return语句的主要内容,如果未能解决你的问题,请参考以下文章

Android中的特殊线程——HandlerThread

等待一段时间不阻塞主线程

PixelBuffer对象和Android上的glReadPixel(ARCore)阻塞

如何在 Android 上解除对 InputStream.read() 的阻止?

本机调用阻塞主线程

JavaSE---线程的控制