首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我设置了subscribeOn(Schedulers.io())时,RxJava调用返回NetworkOnMainThreadException

当你设置了subscribeOn(Schedulers.io())时,RxJava调用返回NetworkOnMainThreadException异常。这是因为在Android开发中,主线程(也称为UI线程)是用于处理用户界面交互的线程,而网络请求通常是耗时操作,如果在主线程上执行网络请求,会导致界面卡顿甚至ANR(Application Not Responding)的问题。

subscribeOn(Schedulers.io())是RxJava中的操作符,用于指定Observable在哪个线程上执行。Schedulers.io()是一个适用于I/O操作的线程池调度器,它会在后台开启一个线程执行Observable的操作。

然而,当你在主线程上执行网络请求时,即使使用了subscribeOn(Schedulers.io())指定了后台线程,仍然会抛出NetworkOnMainThreadException异常。这是因为Android系统限制了在主线程上执行网络请求的操作,以保证用户界面的流畅性和响应性。

为了解决这个问题,你可以使用observeOn(AndroidSchedulers.mainThread())操作符将结果切换回主线程进行处理。AndroidSchedulers.mainThread()是RxAndroid库提供的调度器,用于将操作切换到主线程。

下面是一个示例代码,演示如何正确地在后台线程执行网络请求并在主线程处理结果:

代码语言:txt
复制
Observable.just("https://example.com/api")
        .subscribeOn(Schedulers.io()) // 在后台线程执行网络请求
        .map(url -> {
            // 执行网络请求的代码
            return performNetworkRequest(url);
        })
        .observeOn(AndroidSchedulers.mainThread()) // 切换回主线程处理结果
        .subscribe(result -> {
            // 在主线程处理网络请求结果
            updateUI(result);
        }, error -> {
            // 处理错误情况
            handleError(error);
        });

在上述示例中,performNetworkRequest(url)表示执行网络请求的方法,updateUI(result)表示更新用户界面的方法,handleError(error)表示处理错误情况的方法。

推荐的腾讯云相关产品:腾讯云云服务器(CVM),腾讯云云数据库MySQL版(CDB),腾讯云对象存储(COS)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RxJava2.x 操作符之 compose

题图:来自飞哥的图片工厂 音乐推荐:后来 文丨IT大飞说 预计阅读时间:2.3 分钟 哈喽,朋友们,之前我们学习一些 RxJava2.x 的常用操作符,今天我们来继续学习一下 RxJava 的...compose 操作符能够从数据流中得到原始的被观察者,当创建被观察者,compose 操作符会立即执行,而不像其他的操作符需要在 onNext() 调用后才能执行。...,我们在网络请求的时候就可以这样调用(假设网络请求返回的是Flowable 对象): .compose(RxThreadUtils.flowableToMain()) 使用场景二 compose 操作符可以和...Transformer 结合使用,一方面可以让代码看起来更加简洁,另一方面能够提高代码的复用性,因为 RxJava 提倡链式调用,我们可以合理的使用 compose 操作符来防止链式调用被打破。...RxLifecycle 是 trello 开源的一个配置 RxJava 使用的开源库,我们知道 RxJava 有个缺点就是会导致内存泄露,此时,RxLifecycle 横空出世,它可以配合 RxJava

2.6K10
  • RxJava 容易忽视的细节: subscribeOn() 方法没有按照预期地运行

    被观察者多次调用 subscribeOn() 之后,并不意味着线程只会切换一次,而是线程多次切换之后,最终切换到第一次设置的线程。 所以, subscribeOn() 方法的调用并非一直有效。...由于 BehaviorSubject 的这个特性,subscribeOn() 变得很微妙,它可能会影响到线程的切换。...当我们的 subject 发射第一个值,第一个观察者已经被订阅。由于订阅代码在我们调用 onNext() 已经完成,因此订阅调度程序没有任何作用。...在这种情况下,当我调用 onNext() 它类似于 PublishSubject 的工作方式。 第二和第三个观察者都在初始 onNext() 之后订阅。...总结 RxJava 用好不易,很多东西需要深究其源码。 本文介绍几种方式,RxJava 即使调用subscribeOn() 方法,线程切换也不会起作用。

    1.8K10

    一篇博客让你了解RxJava

    RxJava可以说是2016年最流行的项目之一,最近也接触一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的...,不会报错 当我们又有onComplete又有onError,发现在调用onComplete后会爆出异常 Observable.create(new ObservableOnSubscribe<Integer...当我们写两个onError,会先接受前面的所有事件,最后才报错 介绍ObservableEmitter, 接下来介绍Disposable, 当调用dispose()方法, 它就会将观察者和被观察者的联系切断...在 RxJava 中,提供一个名为 Scheduler 的线程调度器,RxJava 内部提供4个调度器,分别是: Schedulers.io(): I/O 操作(读写文件、数据库、网络请求等),与newThread...这样就可以简化subscribeOn()以及observeOn()的调用次数了。

    51820

    RxJava2 实战(1) - 后台执行耗时操作,实时通知 UI 更新

    偶然的机会看到了开源项目 RxJava-Android-Samples,这里一共介绍十六种RxJava2的使用场景,它从实际的应用场景出发介绍RxJava2的使用,特别适合对于RxJava2已经有初步了解的开发者进一步地去学习如何将其应用到实际开发当中...那么,这两种类型操作所运行的线程是在哪里指定的呢,关键是下面这句: observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread...()).subscribe(disposableObserver); subscribeOn(Schedulers.io()):指定observable的subscribe方法运行在后台线程。...关于这两个函数,还有一点说明:多次调用subscribeOn,会以第一次的为准;而多次调用observeOn则会以最后一次的为准,不过一般我们都不会这么干,就不举例子。...3.2 线程的类型 subscribeOn/observeOn都要求传入一个Schedulers的子类,它就代表运行线程类型,下面我们来看一下都有哪些选择: Schedulers.computation

    2.2K80

    Android RxJavaRxAndroid结合Retrofit使用

    在事件处理过程中出异常,onError() 会被触发,同时队列自动终止,不允许再有事件发出。 onCompleted() 和 onError()在一个队列中只能调用一个,并且是最后一个。...接下来会一一讲解 MainActivity#getWeatherInfo() 在这个方法里实现最基本的RxJava/RxAndroid和Retrofit的结合。....subscribeOn(Schedulers.io())// 指定订阅者在io线程(第一次指定订阅者线程有效) .doOnSubscribe(new Action0()...subscribeOn()只有第一次调用的时候就指定被观察者Observable所在线程。...所以这里我们定义一个sb(StringBuilder),用于将每次返回的Future拼接起来,最后在onCompleted() 中调用tv.setText(sb); 结束语 至此,RxJava/RxAndroid

    1.3K100

    RxJava从入门到不离不弃(五)——Scheduler线程调度

    在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。...有以上这几个 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制。...subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活所处的线程。或者叫做事件产生的线程。...() 与 observeOn()都会返回了一个新的Observable,因此若不是采用上面这种直接流方式,而是分步调用方式,需要将新返回的Observable赋给原来的Observable,否则线程调度将不会起作用...不同于 observeOn() , subscribeOn() 的位置放在哪里都可以,但它是只能调用一次的。

    1.1K10

    一篇文章就能了解Rxjava

    前言: 第一次接触RxJava是在前不久,一个新Android项目的启动,在评估选择RxJavaRxJava是一个基于事件订阅的异步执行的一个类库。...这样,由被观察者调用了观察者的回调方法,就实现由被观察者向观察者的事件传递,即观察者模式。 create() 方法是 RxJava 最基本的创造事件序列的方法。..., Toast.LENGTH_SHORT).show(); } }); 那么,加载图片将会发生在 IO 线程,而设置图片则被设定在主线程。...示例代码(Retrofit + RxJava): networkClient.token() // 返回 Observable<String ,在订阅请求 token,并在响应后发送 token...然而 onStart() 由于在 subscribe() 发生就被调用了,因此不能指定线程,而是只能执行在 subscribe() 被调用时的线程。

    1.4K31

    RxJava2 实战知识梳理(1) - 后台执行耗时操作,实时通知 UI 更新

    偶然的机会看到了开源项目 RxJava-Android-Samples,这里一共介绍十六种RxJava2的使用场景,它从实际的应用场景出发介绍RxJava2的使用,特别适合对于RxJava2已经有初步了解的开发者进一步地去学习如何将其应用到实际开发当中...那么,这两种类型操作所运行的线程是在哪里指定的呢,关键是下面这句: observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread...()).subscribe(disposableObserver);subscribeOn(Schedulers.io()):指定observable的subscribe方法运行在后台线程。...关于这两个函数,还有一点说明:多次调用subscribeOn,会以第一次的为准;而多次调用observeOn则会以最后一次的为准,不过一般我们都不会这么干,就不举例子。...3.2 线程的类型 subscribeOn/observeOn都要求传入一个Schedulers的子类,它就代表运行线程类型,下面我们来看一下都有哪些选择: Schedulers.computation

    67820

    浅析 RxJava 2.x 线程调度

    RxJava 的大名不需要多做介绍,我自己也在项目中使用RxJava也有一段时间,抱着学习的心态,一直想更深入一点的去了解它的实现原理,当然RxJava东西还是蛮多的,不可能一篇文章就能说清楚,so..."); emitter.onComplete(); } }).subscribeOn(Schedulers.io())...产生一个字符串“Hello rxJava”, 然后在监听中打印log,subscribeOn(Schedulers.io()) 设置数据在io线程产生,observeOn(AndroidSchedulers.mainThread...由于Observable的调用是 自下往上,所以 subscribe的线程 是在它后面调用的最近的一个 SubscribeOn方法 所设置的线程(可以理解为,只有第一个设置SubscribeOn生效)...,而Observer的调用时自上往下的,所以 observe的线程 是在它前面调用的最近的一个 ObserveOn方法 所设置的线程。

    50910

    RxJava for Android学习笔记

    RxJava 已经内置几个 Scheduler,它们已经适合大多数的使用场景: Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。...示例: Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 .observeOn...Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定 .subscribeOn(Schedulers.io()) .observeOn(Schedulers.newThread...多个 subscribeOn()和 observeOn() 混合使用时,线程调度状态 四.操作符 RxJava提供很多便捷的操作符,即上文提到的Operator,常用到的Operator例如map,...( );处理密集IO任务的Schedulers.io( );以及Schedulers.trampoline( )能够有效避免StackOverflowError,所以非常适合函数的递归调用

    70630

    Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)

    Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。...主要体现在: 用于描述网络请求 的接口 的设置 网络请求的封装形式 & 发送形式 a. 用于描述网络请求 的接口设置 // 传统方式:Call<.....发送网络请求(异步) observable.subscribeOn(Schedulers.io()) // 在IO线程进行网络请求...实例 创建 网络请求接口实例 并 配置网络请求参数(区别于传统形式) 发送网络请求(区别于传统形式) 发送网络请求 对返回的数据进行处理 本实例侧重于说明 RxJava 的线程控制,关于Retrofit...(new RegisterRequest()) .subscribeOn(Schedulers.io()) //在IO线程进行网络请求

    1.2K21

    Rxjava2-小白入门(三)

    ---- 防止按钮重复(连续)点击 在实际应用中可能在提交信息,登录的时候每次点击按钮就会发送网络请求,当网络比较慢的时候或是其他原因已经请求网路只是返回的数据比较慢,当我们连续点击就会连续的发送请求,...ThrottleFirst: 允许设置一个时间长度,之后它会发送固定时间长度内的第一个事件,而屏蔽其它事件,在间隔达到设置的时间后,可以再发送下一个事件 这个操作符就很好的解决这个问题 RxView.clicks...(Schedulers.io())....(Schedulers.io());//网络请求在子线程 } 运行结果: 10-09 12:39:08.678 11602-11602/com.example.ggxiaozhi.rxjava...retryWhen和retry的主要区别概括来说就是retryWhen将错误的信息发送下去(出错了就发送错误信息),retry是出错了会先尝试重新订阅再发送一变,当达到设置的重试次数还没有成功才会发出错误的信息

    71320

    SpringCloudRPC核心原理:RxJava响应式编程框架Scheduler调度器

    RxJava的Scheduler调度器 顾名思义,Scheduler是一种用来对RxJava流操作进行调度的类,从Scheduler的工厂方法可以获取现有调度器的实现,如下: (1)Schedulers.io...提供两个方法来改变流操作的调度器: (1)subscribeOn():主要改变的是弹射的线程。...在RxJava中,创建操作符创建的Observable主题的弹射任务,将由其后最近的subscribeOn()所设置的调度器负责执行。...在RxJava中,Observable主题的下游消费型操作(如流转换等)的线程调度,将由其前面最近的observeOn()所设置的调度器负责。...本文给大家讲解的内容是SpringCloudRPC远程调用核心原理:RxJava响应式编程框架,RxJava的Scheduler调度器 下篇文章给大家讲解的是SpringCloudRPC远程调用核心原理

    38920
    领券