首页 > 解决方案 > 如何在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 语句之后返回媒体详细信息对象,但它甚至在所有网络调用完成之前就被执行

标签: androidobservablethreadpoolrx-java2

解决方案


getLabelForDepiction(id).subscribeOnaccept异步执行并在完成时调用。尽管如此,在异步语句完成之前,您 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
   ...
}

推荐阅读