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也是一个基于事件驱动的框架,我们来看看一共有哪些事件,分别在什么时候触发:
- onNext,被观察者每发送一次数据,就会触发此事件。
- onError,如果发送数据过程中产生意料之外的错误,那么被观察者可以发送此事件。
- 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();