前言:遗憾的我现在才发现这2个框架惊人之处.现在学学还不算完,但Rxjava真的很难入手,不想okhttp,Retrofit那样看下就可以使用,所以学习Rxjava还需要一段蛮长时间.
Rxjava从1.x到2.x,方法和类都有很多改变,但是功能还是那个样,刚刚学习有太多的不解.对于1.x的,,我也没用过,直接从2.x开始撸起,
Rxjava是什么呢?可以理解为异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者
主要包过这几个接口:
Publisher
Subscriber
Subscription
Processor
Flowable与Observable
publisher和processor我还没用过,后面将去使用再更新.
subsrcipiton,Flowable,observable,observer,subscriber则是重点.
Subscriber 和 Observer的接口是分别独立的,Obsesrver用于订阅Observable,而Subscriber用于订阅Flowable
Rxjava可以理解为观察者模式,观察者模式不知道什么?最好的理解就是我们Android中Button的点击事0件:
观察者(OnClickListener接口),被观察者(Buttion的底层触摸事件),订阅(setOnClickListener()方法)
对应
观察者(Observable或Flowable),被观察者(Observer或Subscriber),订阅(subscribe()方法)
接下来我们看一个例子:
//创建一个被观察者
Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//触发被观察者的一个事件
System.out.println("2,subscribe");
e.onNext("observable");
e.onComplete();
}
});
//订阅被观察者的行为事件
observable.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d)
{
System.out.println("1,当订阅事件后首先执行的是onSubscribe--");
}
@Override
public void onNext(String value) {
System.out.println("4,onNext--");
}
@Override
public void onError(Throwable e) {
System.out.println("onError--");
}
@Override
public void onComplete() {
System.out.println("5,onComplete--");
}
});
Observable作为一个被观察者,并绑定了被观察者的一个触发行为时间,比如小偷是Observable,警察是Observer,,警察不能无缘无端的抓小偷吧,必须要有证据才能去抓,这个证据的
触发方法就是这里的ObservableOnSubscribe接口的subscribe()方法,很好理解.subscribe()方法中有回调参数ObservableEmitter<String> e,这个对象正是下面观察者中的方法onNext,onError,Oncomplete的操作对象,调用e.onNext(),e.complete()即可触发这些
行为,在网路请求数据的时候很好的操作这些网络数据.很灵活.
注意Observer中的onSubscribe方法下的dispoable 对象可以拦截接下来的操作,调用d.dispose()即可;
最后是订阅这个观察者,observable.subscribe(观察者),这次流程就已经完成.
案例打印出来的正是:
1,当订阅事件后首先执行的是onSubscribe--
2,subscribe4,onNext--
5,onComplete--
看着顺序是不是觉的有点疑惑?
按我们思维肯定是:
2,subscribe4,onNext--
5,onComplete--
这个需要大伙们去探查Rxjava源码了,反正这不重要,知道流程就可以起飞了.
数据转换
Rxjava潮热,少不了,这一点.看下例子:
Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
System.out.println("2,subscribe");
e.onNext("observable");
e.onComplete();
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
System.out.println("3,数据处理apply--");
return s;
}
});
observable.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d)
{d.dispose();
System.out.println("1,当订阅事件后首先执行的是onSubscribe--");
}
@Override
public void onNext(String value) {
System.out.println("4,onNext--");
}
@Override
public void onError(Throwable e) {
System.out.println("onError--");
}
@Override
public void onComplete() {
System.out.println("5,onComplete--");
}
});
map操作符的使用,以网络请求数据为例,在
subscribe()方法中获取数据后,我们想对数据进行一个转换,这时候使用map是最好的了,
看下打印结果就明白:
1,当订阅事件后首先执行的是onSubscribe--
2,subscribe
3,数据处理apply--
4,onNext--
5,onComplete--
线程控制
在Rxjava中可以控制观察者和被观察者的线程执行,subscribeOn()和 observeOn(),所以可以利用在被观察者中
subscribe()在子线程去获取网络数据,再切换观察者在主线程更新UI,是不是很有逻辑性.
介绍线程切换的主要参数:
Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 new Thread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比
new Thread()更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在
computation()中,否则 I/O 操作的等待时间会浪费 CPU。
AndroidSchedulers.mainThread():主线程
今天就介绍到这里......
下一章讲解与Retrofit的结合
贴上几个有助于理解的博客:
http://www.tuicool.com/articles/Jr2AJvN