RxJava2.x教程

一、什么是RxJava

GitHub地址:https://github.com/ReactiveX/RxJava,有英文能力的小伙伴可以直接从这里入门。

直接照搬GitHub上面的定义:


RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

译文:RxJava是响应式扩展的Java VM实现:通过使用可观察的序列组合异步和基于事件的程序的库。

It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

译文:它扩展了观察者模式以支持数据/事件序列,并添加了操作符,允许您以声明的方式将序列组合在一起,同时抽象出底层线程、同步、线程安全性和并发数据结构等问题。


然后,这里涉及到两个关键:响应式编程和观察者模式。

1、什么是响应式编程?

2、什么是观察者模式? 

比如,读者订阅了连载小说,读者是观察者(订阅者),连载小说是被观察者(发布者)。当连载小说有更新的时候,会发送消息通知读者,读者可以对此做出处理。

二、为何用RxJava

RxJava 到底是什么? —— 一个词:异步

其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。 

RxJava 好在哪? —— 一个词:简洁

同样是做异步,为什么人们用它,而不用现成的 AsyncTask / Handler / XXX / ... ?

异步操作很关键的一点是程序的简洁性。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

三、RxJava小案例

对Java8的Stream不熟的话推荐先去学习一下,两者语法上比较相似。

引入依赖。当前最新版为2.2.6,因为使用了Spring Boot所以能够自动找到合适的版本。

Demo。注释都写在代码里面了,直接跑就可以了。

/**
 * https://github.com/ReactiveX/RxJava
 * @author z_hh
 * @time 2019年2月13日
 */
public class RxJavaTest {
    public static void main(String[] args) throws Exception {
    	// 1、初始化Observable,发射数据。这里支持lambda表达式,如Observable.create(e -> e.onNext("xxx"));
        Observable.create(new ObservableOnSubscribe<Integer>() {
			@Override
			public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
				emitter.onNext(1);// 发射数据,触发Observer的onNext方法执行,可调用多次
				emitter.onNext(2);
				emitter.onComplete();// 发射完毕,写在后面的onNext将被忽略,触发Observer的onComplete方法执行。同时,与onError互斥,不能同时执行
//				emitter.onError(new RuntimeException("发生异常了"));// 发射异常,触发Observer的onError方法执行,与onComplete互斥,不能同时执行
			}
		})
        
       /*
        * 2、线程调度
        * subscribeOn()指定的就是发射事件的线程,observerOn()指定的就是订阅者接收事件的线程。
        * 多次指定发射事件的线程只有第一次指定的有效,也就是说多次调用 subscribeOn()只有第一次的有效,其余的会被忽略。
        * 但多次指定订阅者接收线程是可以的,也就是说每调用一次 observerOn(),下游的线程就会切换一次。
        * 内置了很多线程:
        * Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作;
        * Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作;
        * Schedulers.newThread() 代表一个常规的新线程;
        * AndroidSchedulers.mainThread() 代表Android的主线程
        */
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.newThread())
        
        // 3、操作符,类似Java8的Stream
        .filter(i -> i > 0)// 数据过滤
        .map(i -> i * 100)// 数据转换
        
        // 4、初始化Observer。可以使用简单版的subscribe(Consumer...),支持lambda表达式,如subscribe(System.out::println);
        .subscribe(new Observer<Integer>() {
        	Disposable disposable;

			@Override
			public void onSubscribe(Disposable d) {// 建立订阅时
				System.out.println("onSubscribe执行了...");
				disposable = d;// 可将Disposable保存起来,以实现取消订阅等功能
			}

			@Override
			public void onNext(Integer t) {// emitter.onNext时调用
				System.out.println("onNext执行了...收到内容:" + t);
				disposable.dispose();// 取消订阅,第二条数据将不会收到
			}

			@Override
			public void onError(Throwable e) {// emitter.onError时调用
				System.out.println("onError执行了...");
			}

			@Override
			public void onComplete() {// emitter.onComplete时调用
				System.out.println("onComplete执行了...");
			}
		});
        
        System.out.println("主线程执行完毕!");
        System.in.read();
    }
}

运行结果。 

官方API文档http://reactivex.io/RxJava/2.x/javadoc/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值