【问题标题】:Keep main thread wait until RxJava Observable complete保持主线程等待,直到 RxJava Observable 完成
【发布时间】:2017-03-12 00:32:03
【问题描述】:

我想保持我的主线程直到 RxJava 2 Observable 完成。我的编码和这里一样。情况是当我请求方法包含以下代码时,方法只是执行而不等待可观察的

 Observable
                        .fromArray(observableList)
                        .subscribeOn(Schedulers.io())
                        .subscribe(new Consumer<List<Observable<List<String>>>>() {
                        @Override
                        public void accept(List<Observable<List<String>>> list) throws Exception {

                            for (Observable<List<String>> observable : list) {
                                System.out.println("Thread name " + Thread.currentThread().getName());

                                observable.subscribe(new Consumer<List<String>>() {
                                    @Override
                                    public void accept(List<String> t) throws Exception {

                                        Gson jsonBuilder = new Gson();

                                        Object obj = new Object();

                                        JsonElement element = jsonBuilder.toJsonTree(obj);

                                        element.getAsJsonObject().addProperty(t.get(0), t.get(1));

                                        Gson g = new Gson();
                                        Object out = g.fromJson(t.get(1), Object.class);

                                        microResponses.put(t.get(0), out);
                                    }
                                });

                            }

                        }


         });

【问题讨论】:

    标签: java multithreading rx-java rx-java2


    【解决方案1】:

    您不需要多级订阅,也不需要嵌套 Observable:

    Oservable
    .fromArray(observableList)
    .flatMapIterale(i -> i)
    .flatMap(i -> i)
    .doOnNext(t -> {
       Gson jsonBuilder = new Gson();
       Object obj = new Object();
       JsonElement element = jsonBuilder.toJsonTree(obj);
       element.getAsJsonObject().addProperty(t.get(0), t.get(1));
       Gson g = new Gson();
       Object out = g.fromJson(t.get(1), Object.class);
       microResponses.put(t.get(0), out);
    })
    // .subscribe(...) or .doOnComplete(...).subscribe();
    ;
    

    但是,您编写的代码有几个问题:

    • 前四行是空操作,因为您没有使用 JsonElement。
    • 为什么不直接使用new JsonObject()
    • Object out = g.fromJson(t.get(1), Object.class); 除了空的 JsonObjecy 之外不会产生任何东西,因为 Object 没有任何属性。
    • 您为什么使用 List,而不是真正有意义的东西,例如 Map.Entry&lt;String,Object&gt;,甚至是 Pair&lt;String, Object&gt;

    【讨论】:

      【解决方案2】:

      使用以下任何一种:- 1.删​​除订阅 2. 使用 Thread.sleep 足够大的时间来完成您的任务 3. Google toBlocking 在 rxjava 中的使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-28
        • 2018-06-29
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多