RxJava快速入门

简单来说RxJava是一个实现响应式编程的类库。

那什么是响应式编程?

响应式编程的核心思想是"数据流是第一等公民”,程序的逻辑建立在数据流的变化之上。

响应式编程的几个核心概念:
(1)数据流:在响应式编程中,数据以流(Streans)的形式存在。流就像一条河,源源不断。比如一个数组或集合可以看作一个数据流,数组或集合中的每个元素视为数据流中的数据项。

(2)异步处理:传统的同步编程模型中,当执行一个耗时的操作时,主线程会被阻塞,直到操作完成才能继续执行后续的代码。这种模型存在一个问题,即当一个操作耗时很长,主线程被阻塞时,整个应用程序就会感觉不够灵活和响应迟缓。
响应式编程则通过异步处理来解决这个问题。在响应式编程中,当需要执行一个可能耗时的操作时,不会让主线程直接等待其完成。相反,这个操作会被放到一个单独的执行线程(通常是线程池中的一个线程)中去执行,同时主线程可以继续执行其他任务而不被阻塞。一旦异步操作完成,会通过回调函数、观察者模式或者其他机制通知应用程序,以便在未来某个时间点处理操作结果。

(3)变化传播:当数据源发生变化时,响应式编程模型会自动将变化传播到依赖这些数据源的地方。这种传播是自动的,不需要显式调用。

什么是RxJava?

Rxlava是基于观察者模式实现的,分别有观察者和被观察者两个角色,被观察者会实时传输数据流,观察者可以观测到这些数据流。基于传输和观察的过程,用户可以通过一些操作方法对数据进行转换或其他处理。在RxJava中,观察者就是Observer,被观察者是Observable和Flowable。

Observable适合处理相对较小的、可控的、不会迅速产生大量数据的场景。它不具备背压处理能力,也就是说,当数据生产速度超过数据消费速度时,可能会导致内存溢出或其他性能问题。

Fowable是针对背压(反向压力)问题而设计的可观测类型。背压问题出现于数据生产速度超过数据消费速度的场景。Flowable 提供了多种背压策略来处理这种情况,确保系统在处理大量数据时仍然能够保持稳定。

被观察者. subscribe(观察者),它们之间就会建立订阅关系,被观察者传输的数据或者发出的事件会被观察者观察到。

前面提到用户可以通过一些方法对数据进行转换或其他处理,RxJava提供了很多操作符供我们使用,这块其实和Java8的Stream类似,概念上都是一样的。

操作符主要可以分为以下几大类:

变换类操作符,对数据流进行变换,如map、flatMap 等。比如利用map将int类型转为string

Flowable<String> flowable = Flowable.range(0,Integer.MAX_VALUE)
	.map(i->String.valueOf(i))

聚合类操作符,对数据流进行聚合,如toList、toMap等

Flowable.range(0,Integer.MAX_VALUE).toList()

过滤操作符,过滤或者跳过一些操作符,如fliter、skip等

Flowable.range(0,Integer.MAX_VALUE).fliter(i->i>10).toList();

连接操作符,将多个数据流连接到一起,如concat、zip等

//创建两个Flowable,通过concat连接得到一个被观察者,进行统一处理
//创建两个Flowable 对象
Flowable<String> flowable1 = Flowable.just( "A""B""C");
Flowable<String> flowable2 = Flowable.just("D""E""F");
//使用concat操作符将两个Flowable合并
Flowable<String> flowable = Flowable.concat(flowable1,flowable2);

排序操作符,对数据流内的数据进行排序,如sorted

Flowable<String> flowable = Flowable.concat(flowable1,flowable2).sorted();

RxJava也是一个基于事件驱动的框架,我们来看看一共有哪些事件,分别在什么时候触发:

  1. onNext,被观察者每发送一次数据,就会触发此事件。
  2. onError,如果发送数据过程中产生意料之外的错误,那么被观察者可以发送此事件。
  3. onComplete,如果没有发生错误,那么被观察者在最后一次调用onNext,之后发送此事件表示完成数据传输。对应的观察者得到这些事件后,可以进行一定处理,例如:
flowable.observeon( Schedulers.io())
.doOnNext( item -> {
System.out.println("来数据啦"+ item.toString());})
.doOnError(e -> {
system.out.println("出错啦"+e.getMessage( ));})
.doonComplete(( ->{
system.out.println("数据处理完啦");}).subscribe();
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非鱼Swx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值