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

尽管使用RxJava订阅了另一个线程,但在使用Google的People API时仍然可以获得IllegalStateException

的原因可能是由于在订阅的线程中进行了对UI线程的操作。

RxJava是一个用于异步编程的库,它可以帮助我们简化多线程编程的复杂性。当我们使用RxJava订阅一个线程时,代码会在该线程中执行,而不会阻塞主线程(也就是UI线程)。这样可以避免在执行耗时操作时导致UI线程卡顿。

然而,Google的People API是一个与Google联系人相关的API,它通常需要在UI线程中进行调用。如果我们在非UI线程中调用该API,就会导致IllegalStateException异常。

解决这个问题的方法是使用RxJava的线程切换功能,将对Google的People API的调用切换到UI线程中执行。可以使用RxJava的observeOn操作符来指定切换到UI线程,例如:

代码语言:txt
复制
Observable.just(...)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...)

在上述代码中,subscribeOn(Schedulers.io())指定了订阅的线程为IO线程,而observeOn(AndroidSchedulers.mainThread())则指定了观察者的线程为UI线程。

这样,无论在哪个线程中订阅了Google的People API,都会在UI线程中执行相关操作,避免了IllegalStateException异常的发生。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,我无法提供具体的链接。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以通过腾讯云官方网站进行了解和查询相关产品。

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

相关·内容

All RxJava - 为Retrofit添加重试

我一直使用Square的retrofit和ReactiveX的RxJava,接下来我就来分享一下我是如何使用这两个库来实现一个可配置次数的退避重试策略的。 Repeat? Retry!...我们的重点是,只有遭遇了IOException时才重试网络请求,也就是说那些IllegalStateException,NullPointerException或者当你使用gson来解析json时还可能出现的...因此.retry()以及它的重载函数已经不能满足我们的需求了,好在RxJava为我们提供了另一个非常有用的操作符.retryWhen(),我们可以通过判断异常类型,来决定是否发起重试(重订阅)。...或者onError那么将跳过重订阅,最终这些终止事件将会向下传递,从此这个操作符的重订阅功能也就失效了。...③使用.timer()操作符实现一个简单的二进制指数退避算法,需要注意的是.timer()操作符默认执行在Schedulers.computation(),我们并不希望它切换到别的线程去执行重试逻辑,因此使用了它的重载函数

1.7K10

RxJava && Agera 从源码简要分析基本调用流程(2)

作者:晋中望 接上篇RxJava && Agera 从源码简要分析基本调用流程(1)我们从"1.订阅过程"、“2.变换过程”进行分析,下篇文章我们继续分析"3.线程切换过程" 3.线程切换过程 从上文中我们知道了...现在再结合之前的过程我们从头梳理一下: [image.jpg] 在subscribeOn()时,我们会新生成一个Observable,它的成员onSubscribe会在目标Subscriber订阅时使用传入的...的订阅事件整体都切换到了另一个线程;而observeOn()则是将初始Observable发送的消息切换到另一个线程通知到目标Subscriber。...(RxJava的出现慢慢让Otto退出了舞台,现在Otto的Repo已经是Deprecated状态了,而EventBus依旧坚挺)基于RxJava的观察订阅取消的能力和PublishSubject的功能...三.后记 前面相信最近这段日子里,提到RxJava,大家就会想到Google最近刚刚开源的Agera。

10.4K10
  • Rx Java 异步编程框架

    Schedulers 调度器: RxJava 操作符不直接与线程或 ExecutorServices 一起工作,而是与所谓的Scheduler 一起工作,这些有用的类来自统一的 API....RxJava 3 并发抽象,其提供了几个标准的调度器。 Schedulers.computation():在后台固定数量的专用线程上运行计算密集型工作。...例如,可以使用它来拥有一个更大但仍然固定的线程池(分别与 calculation() 和 io() 不同)。...Observable 在RxJava中,一个实现了Observer接口的对象可以订阅(subscribe)一个Observable 类的实例。...它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。

    3.1K20

    RxJava 详解

    给正在使用 RxJava 但仍然心存疑惑的人一些更深入的解析 在正文开始之前的最后,放上GitHub链接和引入依赖的gradle代码:  Github: https://github.com/ReactiveX...事实上,虽然Action0和Action1在 API 中使用最广泛,但 RxJava 是提供了多个ActionX形式的接口 (例如Action2,Action3) 的,它们可以被用以包装不同的无返回值的方法...compose()的原理比较简单,不附图喽。 (五) 线程控制:Scheduler (二) 除了灵活的变换,RxJava 另一个牛逼的地方,就是线程的自由控制。...Retrofit 除了提供了传统的Callback形式的 API,还有 RxJava 版本的Observable形式 API。...因此,我写了这篇《给 Android 开发者的 RxJava 详解》,希望能给始终搞不明白什么是 RxJava 的人一些入门的指引,或者能让正在使用 RxJava 但仍然心存疑惑的人看到一些更深入的解析

    1.8K10

    关于RxJava2.0你不知道的事(一)

    :rxjava:2.x.y 下,类放在了 io.reactivex 包下用户从 1.x 切换到 2.x 时需要导入的相应的包,但注意不要把1.x和2.x混淆了。...当你从本地磁盘某个文件或者数据库读取数据时(这个数据量往往也很大),应当使用Flowable,这样下游可以根据需求自己控制一次读取多少数据; 以读取数据为主且有阻塞线程的可能时用Flowable,下游可以根据某种条件自己主动读取数据...Schedulers 在2.0的API中仍然支持主要的默认scheduler: computation, io, newThread 和 trampoline,可以通过io.reactivex.schedulers.Schedulers...相关API如下: 实际操作下,写个方法,创建一个Transformer调度器: //子线程运行,主线程回调 public Observable.Transformer io_main(final...在RxJava2.0中,Transformer划分的更加细致了,每一种“Observable”都对应的有自己的Transformer,相关API如下所示: 这里以FlowableTransformer

    1.5K20

    Rxjava源码解析笔记 | Rxjava基本用法

    为的是让后面的操作符、线程控制等能够跟流式OPI来完善, 而不是其他方式如观察者去订阅被观察者(非链式)—— 这样从意思上容易理解,但在API调用上很不方便; 链式调用:理解比较绕,但能跟流式...OPI来完善,API调用上非常方便; 非链式调用:意思上容易理解,但在API调用上很不方便; 第三步,订阅: 前面我们说概念的时候,都是观察者订阅被观察者的, 可是这里代码中, “奇怪”的是“...被观察者(Observable)去订阅(subscribe)观察者(Observer)”, 这里就是上面说的, 为了后面能够通过流式OPI, 使进行操作符、线程控制等操作时能够通过链式调用来完善;...//第三步:订阅 observable.subscribe(observer); } 本节完整代码如下: 这里其实只是Rxjava的一种简单的使用, 主要是理解一下Rxjava...对传统观察者设计模式的拓展和改进; 实际情况当中,其实它还包括了很多操作符, 以及Rxjava最核心的线程控制调度, 这两部分是Rxjava的核心.

    69220

    RxJava这么好用却容易内存泄漏?解决办法是...

    一般的做法是订阅成功后,拿到Disposable对象,在Activity/Fragment销毁时,调用Disposable对象的dispose()方法,将异步任务中断,也就是中断RxJava的管道,代码如下...uber/AutoDispose(1.2.0版本) 内部维护了两个管道,一个是发送生命周期状态变化的管道,我们称之为A管道,另一个是业务逻辑的管道,我们称至为B管道,B管道持有A管道的观察者引用,故能监听...(); } 此接口描述的就是RxJava的作用域,即从事件订阅到事件结束。...,且它没有做任何处理,如果你在子线程使用,就需要额外注意了,而且它只有在页面销毁时,才会移除观察者,试想,我们在首页一般都会有非常多的请求,而这每一个请求都会有一个AndroidLifecycle对象,...,并且当前非主线程时,直接抛出异常,也就说明使用AutoDispose不能在子线程订阅事件。

    4.7K20

    【Android】RxJava的使用(一)基本用法

    好奇的我怎么能错过,于是Google了一下,说RxJava好用的和说RxJava难用的都有,于是自己也亲自尝试了一下(感觉不容易上手)。...RxJava 在上面介绍了观察者模式,这里也将RxJava中的三个角色进行一下角色分配 观察者:Observer; 被观察者:Observable; 订阅(或注册):subscribe()。...订阅 创建了Observable和Observer之后,再用subscribe()方法将它们联结起来 直接看代码吧,这里只展示了RxJava的基本用法,暂时看不出RxJava的优势。...unsubscribe(): 这是Subscriber所实现的另一个接口Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。...的使用(三)转换(map、flatMap) Android RxJava的使用(四)线程控制 —— Scheduler 以上有错误之处感谢指出

    1.2K70

    JAVA | Guava EventBus 使用 发布订阅模式

    > 引入依赖后,这里我们主要使用 com.google.common.eventbus.EventBus 类进行操作,其提供了 register、unregister、post...Guava Event 实际上是使用线程池来处理订阅消息的,通过源码可以看出,当我们使用默认的构造方法创建 EventBus 的时候,其中 executor 为 MoreExecutors.directExecutor...(),其具体实现中直接调用的 Runnable#run 方法,使其仍然在同一个线程中执行,所以默认操作仍然是同步的,这种处理方法也有适用的地方,这样既可以解耦也可以让方法在同一个线程中执行获取同线程中的便利...异步使用 通过上面的源码,可以看出只要将构造方法中的 executor 换成一个线程池实现即可, 同时 Guava EventBus 为了简化操作,提供了一个简化的方案即 AsyncEventBus EventBus...,通过实现 SubscriberExceptionHandler 来处理异常的情况,无论时同步还是异步都能游刃有余 参考 https://github.com/google/guava https:/

    8.1K10

    快速进阶 Kotlin Flow:掌握异步开发技巧

    这样,通过协程的挂起和恢复机制,Flow 实现了数据的异步传递和处理。 此外,Flow 还支持冷流的特性。只有在有订阅者时,发射器才会开始执行。这有助于避免不必要的计算和资源浪费。...RxJava 也有类似的概念,但在使用时需要特别注意避免潜在的内存泄漏和资源浪费。 线程调度 RxJava 和 Kotlin Flow 都提供了线程调度的机制,允许在不同线程中执行异步操作。...在 RxJava 中,你可以使用 observeOn 和 subscribeOn 来切换线程。而在 Kotlin Flow 中,你可以使用 flowOn 操作符来实现线程切换。...两者的使用方式相似,但 Kotlin Flow 可以更加自然地与协程集成,避免了额外的配置。 背压处理 RxJava 提供了丰富的背压处理策略,例如缓存、丢弃、最新值等。...如果你需要丰富的背压处理策略来控制高频率事件流的流量,RxJava 提供了更多的选择。 如果你需要与其他基于 RxJava 的库集成,继续使用 RxJava 可能更加方便。

    1.3K30

    我去你的 Kotlin 协程

    网络请求这个就不用说了,RxJava 配合 Retrofit 来做网络请求,各种复杂操作和线程切换,谁用谁知道——现在用协程就可以了,比 RxJava 方便;而 event bus,当时比较火的是两个开源库...就在这样的时代背景下,LiveData 在 2017 年发布了。它的功能是让变量可以被订阅。...跟一般的订阅比起来,LiveData 有两个特点:一是它的目标非常直接,直指界面刷新,所以它的数据更新只发生在主线程;二是它借助了另一个架构组件——Lifecycle——的功能,让它可以只在界面到了前台的时候才通知更新...所以 RxJava 太大了,并且是第三方的,这两个原因结合起来,就让 Android 的 LiveData 没有使用 RxJava。这并不是一个竞争或胸怀的问题,而是一个「不要把事情变复杂」的问题。...2017 年之前,事件订阅大部分人是用 EventBus 或者 Otto,并且在 RxJava 流行起来之后,EventBus 和 Otto 的使用开始持续下降;2017 之后,对于简单场景大家慢慢过渡到了

    95750

    八个层面比较 Java 8, RxJava, Reactor

    之前转载小马哥的那篇《Reactive Programming 一种技术,各自表述》时,就已经聊过这个关于名词之争的话题了,今天群里的讨论更是加深了我的映像。...如果被校测到流被重复使用了,它会跑出抛出一个 IllegalStateException 异常。...当存在订阅者时,每一次执行都会从初始点开始完整地执行一边。 4. Asynchronous(异步) CompletableFuture - 这个类的要点在于它异步地把多个操作连接了起来。...subscribeOn 和 observeOn允许你来控制订阅以及接收(这个线程会调用 observer 的 onNext / onError / onCompleted方法)。...很多 RxJava 1 的使用者用 Observable 来处理不适用回压的事件,或者是使用 Observable 的时候没有配置任何策略,导致了不可预知的异常。

    3.5K70

    彻底搞清楚 RxJava 是什么东西

    其实从rxjava14年出现到现在,我是去年从一个朋友那里听到的,特别是随着现在app项目越来越大,分层越来越不明确的情况下,rxjava出现了,以至于出现了rxandroid。...接下来说说rxjava RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2....线程控制:Scheduler (二) 1) Scheduler 的 API (二) 2) Scheduler 的原理(二) 3) 延伸:doOnSubscribe() RxJava 的适用场景和使用方式...观察者模式本身的目的就是『后台处理,前台回调』的异步机制,因此异步对于 RxJava 是至关重要的。而要实现异步,则需要用到 RxJava 的另一个概念: Scheduler 。  ...RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景: Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。

    20.2K115

    Spring-webflux默认使用Netty?

    什么是“响应式” 所谓响应式,举个例子,当调用一个api获取数据时,无需阻塞等待数据返回,而是当有数据返回时会进行告知。...一般作用于多个对象 Flux people = personDao.listAllPeople(); 尽管webflux框架基于Reactor,它也能与其他的响应式框架同时使用,比如RxJava...评估一个项目是否应该选择webflux的最简单的方式是,依据项目中是否会使用很多的阻塞API,比如JDBC或者一些阻塞式的API就不适用与webflux项目。...并发模型 尽管webmvc和webflux都支持使用注解来定义一个Controller,但是其实现方式完全不同。...webmvc是一个Servlet应用,实现是阻塞式IO,其维护一个线程池来处理每一个用户请求,也就是当Servlet容器启动时,就会创建比如10个线程出来,因此系统吞吐量的瓶颈在于有限的连接数和阻塞的请求处理过程

    50310

    三十三、Hystrix执行目标方法时,如何调用线程池资源?

    Hystrix使用RxJava来编程,那么你是否知道它在执行目标方法时(发射数据时),是如何调用线程池资源的呢?换句话说,Hystrix是如何把自己的线程池“输入”到RxJava里让其调度的呢?...---- 正文 Hystrix的源码是使用RxJava来实现的,所以在文首得先认识认识RxJava里的一些相关概念。...这个方法一般做的事件类似于观察者做的事情,只是自己不是最终的回调者(观察者即最终回调者) doOnUnSubscribe:取消订阅时的监听 doOnCompleted:Observable正常终止时的监听...(注意:正常终止才会执行哦) doOnError:出错时的监听 doOnTerminate:订阅即将被终止时的监听,无论是正常终止还是异常终止 observeOn:语义为:观察者在哪个Scheduler...);这个线程池哦~ 就这样,该调度器里面包括了使用的线程池信息,subscribeOn()就会根据当前Observable和获取到的调度器创建任务,并执行。

    1.3K20

    Kotlin上的反应式流-SharedFlow和StateFlow

    尽管这也意味着对SharedFlow的Flow.collect()的调用不会正常完成,但订阅仍然可以被取消。正如你所期望的,这种取消是通过取消coroutine发生的。...在到达第三个事件之前,另一个订阅者出现了,但第一个订阅者被suspend,并保持这样直到获取该事件。这意味着emit()将无法将第三个事件传递给那个订阅者。...SharedFlow不仅使用起来更简单、更快速,而且比BroadcastChannel的功能更丰富。但请记住,在有意义的时候,仍然可以而且应该使用Channels API中的其他元素。...尽管如此,你可能还是会担心当应用程序在后台时,StateFlow会产生出数值。但你不需要这样担心。...虽然它们可能没有带来什么 "新 "东西,但它们提供了更直接和有效的替代方案。例如,在你使用RxJava的PublishSubject的地方,你可以使用SharedFlow。

    2.3K60

    Spring Boot 2.0-WebFlux framework

    简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来垂直缩放(即在 JVM 内)而不是水平(即通过集群)。...Spring Framework 在许多自己的 Reactive API 中暴露了 Flux 和 Mono。然而,在应用级别,一如既往,Spring 提供了选择,并完全支持使用RxJava。...支持以下 Reactive API: Reactor 3.x 支持开箱即用 依赖项在类路径上时支持 RxJava 2.x 当 ·io.reactivex:rxjava 和 io.reactivex:rxjava-reactive-streams...`(RxJava 和 Reactive Streams 之间的适配器)依赖关系在类路径上时,支持 RxJava 1.x 例如,请求体可以是以下方式之一,它将在注解和功能编程模型中自动解码: Accountaccount...Observable - 与上类似, 但是使用的 RxJava Observable 类型 Flowable - 与上类似, 但是使用的 RxJava 2 Flowable 类型。

    3.2K50
    领券