【问题标题】:NetworkOnMainThreadException despite RxJava2 subscribeOn(Schedulers.io) [duplicate]NetworkOnMainThreadException 尽管 RxJava2 subscribeOn(Schedulers.io) [重复]
【发布时间】:2019-03-24 14:56:03
【问题描述】:

最近尝试学习 RxJava,我想在我的 viewmodel 类中用 RxJava2 替换我在 Android 中的异步任务。但是,当我运行它时,运行以下命令时出现“NetworkOnMainThreadException”异常:

 private void requestLocationDetails() {
    try {
        compositeDisposable.add(Observable
                .just(JsonRestCaller.readJsonFromUrl(buildUrl()))
                .subscribeOn(Schedulers.io())
                .subscribeWith(new DisposableObserver<JsonObject>() {
                    @Override
                    public void onNext(JsonObject jsonObject) {
                        try {
                            parseJson(jsonObject);
                        } catch (IOException e) {
                            Log.e(TAG, e.getMessage());
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                    }
                }));
    } catch (IOException e) {
        Log.e(TAG, e.getMessage());
}

据我所知,

.subscribeOn(Schedulers.io())

使我的方法在后台线程上运行,但 Android 另有说明。我在这里遗漏了什么吗?

【问题讨论】:

    标签: android rx-java2 subscription


    【解决方案1】:

    首先,subscribeon 只是让你订阅另一个线程上的 observable。它的 observeOn 在另一个线程上运行 onNext。然而,我不认为这是你的问题。它只是在这个线程上运行。 just 函数会立即调用并由 observable 发出,因此它会在您调用的线程上调用。

    【讨论】:

    • @Onik 因为我很快意识到第一个错误(这是纠正他的错误,但不是问题),我不确定答案,所以我删除了它。事实证明,经过几分钟的研究,我能够证实我的猜测并重新回答。
    • 啊,现在我明白了,好吧,这让它更清楚了。所以你基本上说的是,仅与 subscribeOn 结合使用没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多