一、RxJava简介
这句话是官网上的
百度翻译asynchronous——http://fanyi.baidu.com/translate#en/zh/asynchronous
百度翻译event-based——http://fanyi.baidu.com/translate#en/zh/event-based
1、A library for composing asynchronous and event-based programs by using observable sequences
Asychronous
1、异步的,RxJava是一个异步的库
2、基于回调的
Event-based
1、基于事件的
2、事件分发的库,消息传递的库
二-1、RxJava1代码实例
我们先看一下RxJava1的例子,再看一下RxJava2的。
首先我们用Observable的create()方法去创建一个Observable对象
这个create方法里边存放的参数是一个OnSubscribe
最后通过创建出来的Observable对象去subscribe()一个Observer
Observer里边有三个方法,分别是OnComplete(),onError(),onNext()
这个OnSubscribe里边有一个Call()方法,里边的参数是一个subscribe
之后调用Observable的subscribe方法反回了一个Subscription。
这个呢就是一个最简单的RxJava1的一个例子。
findViewById(R.id.btnRxJava1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Subscription tSubscription = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (!subscriber.isUnsubscribed()) { subscriber.onNext("test"); subscriber.onCompleted(); } } }).subscribe(new Observer<String>() { @Override public void onCompleted() { System.out.println("onCompleted"); } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { System.out.println("onNext:" + s); } }); } });
运行过程,首先通过subscribe调用onNext()方法传递一个字符串,然后再调到OnComplete()的时候,打印一下OnCompleted这个字符串,再调到OnNext()的时候,除了打印onNext这个方法名,还回把上边传下来的test打印出来。
它会先去打印这个onNext这个方法名,之后打印传下来的字符串之后onCompleted(),这就是RxJava1的一个比较简单的例子。
二-2、RxJava1的基本元素
1、Observable
2、Observer
3、Subscription
4、OnSubscribe
5、Subscriber
三-1、RxJava2代码实例
先将RxJava1代码注释起来,之后切换一下库
// compile 'io.reactivex:rxjava:1.3.0' // compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex.rxjava2:rxjava:2.0.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
之后我们看一下RxJava2的代码
findViewById(R.id.btnRxJava2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { if (!e.isDisposed()) { e.onNext("1"); e.onNext("2"); e.onNext("3"); e.onNext("4"); e.onNext("5"); e.onNext("6"); e.onNext("7"); e.onNext("8"); e.onNext("9"); e.onNext("10"); e.onComplete(); } } }).subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { System.out.println("onSubscribe"); } @Override public void onNext(String value) { System.out.println("onNext:" + value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { System.out.println("onCompleted"); } }); Flowable.create(new FlowableOnSubscribe<String>() { @Override public void subscribe(FlowableEmitter<String> e) throws Exception { if (!e.isCancelled()) { e.onNext("test"); e.onComplete(); } } }, BackpressureStrategy.DROP).subscribe(new Subscriber<String>() { @Override public void onSubscribe(Subscription s) {
// s.request(Long.MAX_VALUE); System.out.println("onSubscribe");} @Override public void onNext(String s) { System. out.println( "onNext:" + s); } @Override public void onError(Throwable t) { } @Override public void onComplete() { System. out.println( "onCompleted"); } }); } });}
可以看到还是相应的一个Observable创建,这是我们比较熟悉的刚才看过的一个东西,
下面呢还有一个Flowable,这两个有什么不一样呢,先来简单去解释一下,因为用RxJava的时候会有一个背压问题,那么在RxJava里边的时候,Observable有一些可以处理背压问题的,有一些是处理不了背压问题的,那么现在呢,在RxJava2里边,他们就把这两个做了一个拆分,那么现在Observable完全不去处理背压问题,新拆出来一个Flowable是会有一个背压策略的,这一点是这两个的区别,我们先看一下这个完全不去处理的Observable是怎么用的:
首先还是create()的方法,传进去一个ObservableOnSubscribe,然后这里边有一个subscribe()方法,这里有一个新面孔Emitter,之后就是熟悉的调用subscribe()方法,里边传进去一个Observer,可以看到里边多了一个方法OnSubscribe(),里边有一个比较陌生的参数Disponsable,之后又是三个熟悉的方法onNext(),onError(),onCompleted()。
接下来我们看一下新拆出来这个解决背压问题的Flowable是怎么写的:
其实还是同一个模式的有一个create()方法,里边传进去一个FlowableOnSubscribe,之后里边是一个subscribe()方法,参数是一个Emitter,这里有一个第二个参数就是背压策略,这里我们先传入一个Drop丢弃,之后还是熟悉的Subscribe(),参数是Subscriber,这里也是多了一个方法,onSubscribe()的时候,里边会有一个Subscription,之后又是三个熟悉的onNext(),onError(),onComplete(),运行一下。
首先先说上边的Observable,首先是onSubscribe,之后是发送数据test,第三个是onCompleted,上边这个没有问题跟我们之前看得没有什么太大区别,我们接下来看下边这个,首先OnSubscribe是没有问题的,但是接下来的按照前边说的它应该打印onNext,但是它并没有打,而是直接打了OnCompleted,那么这是为什么呢,因为解决背压问题要这样写,要有一个响应式拉取的一个策略,
@Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); System.out.println("onSubscribe"); }
我们再跑一下
现在可以看到这个onNext打印出来了,因为这个Flowable是专门为处理背压来做的,所以在OnSubscribe()的时候需要手动的request一下数据做一个响应式的拉取。
三-2、RxJava2基本元素
1、Observable和Flowable
2、Observer和Subscriber
3、Disponsable和Subscription
4、相应的OnSubscribe
5、Emitter
下章分析
1、RxJava1的基本元素