首页 > 解决方案 > 尽管正确调用了observeOn(io线程),但RxJava NetworkOnMainThreadException

问题描述

这是代码

        getCompositeDisposable().add(Single.fromCallable(new Callable<Boolean>() {
                @Override
                public Boolean call() throws Exception {
                    URL url = new URL(pageUrl);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    int code = connection.getResponseCode(); // <- crashes here
                    return code == 200;
                }
            })
                    .observeOn(getSchedulerProvider().io())
                    .subscribeOn(getSchedulerProvider().ui())
                    .subscribe((pageAvailable) -> {
                        boolean useCache = !pageAvailable;
                        getMvpView().loadPage(useCache, pageUrl);
                    }, Timber::e)
    );

无法理解这里有什么问题。网络代码应该在 io 线程上运行,然后将结果返回给 ui 线程。这段代码甚至可以在 io 线程上运行吗?我很困惑。

标签: androidrx-java

解决方案


尽管正确调用了observeOn(io线程)

不正确,您的代码应为:

  .subscribeOn(getSchedulerProvider().io()) //do work on the io thread
  .observeOn(getSchedulerProvider().ui()) //apply changes to ui thread

永远记住那subscribeOn是你工作的地方,秩序很重要


推荐阅读