异步,对于Android开发者来说,听到耳根烂的一个词语。Android中Handler和AsyncTask
其实就是异步操作的典型封装。异步操作的关键点就是代码简洁,如果碰到繁琐的逻辑功能,繁琐的异步代码,让人头大,不知所以然。在异步流行的程序时代,RxJava应运而生。RxJava 的优势就是简洁,但它的简洁的与众不同之处在于,即使程序逻辑变得越来越复杂,它依然能够保持简洁。RxJava作为一个优秀的异步操作工具库,有必要花时间学习下。
1.RxJava的简介
RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。
对观察者模式不熟悉的,可参考设计模式-观察者模式
2.RxJava的特点
1.易于并发从而更好的利用服务器的能力;
2.易于有条件的异步执行;
3.一种更好的方式来避免回调地狱;
4.一种响应式方法;
3.RxJava的重要组成
基本构成
Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。
Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
重要方法
Observable的生命周期中有三个重要的事件,onNext(检索数据)、onCompleted(完成)和onError(发现错误)。
onNext()即通知Observable放松数据至Observer;
onCompleted() 即通知观察者Observable没有更多的数据;
onError()即观察者有错误出现了;
4.Observable分类
熟悉观察者模式的都知道,观察者模式分为拉模型和推模型两种模式。其实,Observable也有两种模式。在RxJava介绍文档中,Observable是从发射物的角度来区分的,有两种不同的Observables:热的和冷的。一个"热"的Observable典型的只要一创建完就开始发射数据,因此所有后续订阅它的观察者可能从序列中间的某个位置开始接受数据(有一些数据错过了)。一个"冷"的Observable会一直等待,直到有观察者订阅它才开始发射数据,因此这个观察者可以确保会收到整个数据序列。
5.Observable创建
Observable.create()
create()方法使开发者有能力从头开始创建一个Observable。它需要一个OnSubscribe对象,这个对象继承Action1,当观察者订阅我们的Observable时,它作为一个参数传入并执行call()函数。Observable通过使用subscriber变量并根据条件调用它的方法来和观察者通信。
<span style="font-size:14px;"> Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i ++) {
subscriber.onNext(i);
}
subscriber.onCompleted();
}
});
Subscription subscriber = obserale.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
Log.i("123", "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.i("123", "onError: ");
}
@Override
public void onNext(Integer integer) {
Log.i("123", "onNext : " + integer);
}
});</span>
通过Observable.create()方法创建了Observable对象,并调用subscribe()方法对Observable订阅。订阅以后,我们开始接收Observable发送的数据(即定义的整数)。
Observable.from()
上面例子里,定义了一个列表通过一个for循环一个个的发送来完成信息的发送。假如已经存在的数据列表,当然使用上面的方法肯定可以实现。除了上面的方法,有没有其他的实现方式呢?当然可以实现,要不然这个小标题就无用了,具体怎么实现的,看下面代码。
<span style="font-size:14px;"> List<Integer> lists = new ArrayList<>();
lists.add(1);
lists.add(2);
lists.add(3);
lists.add(4);
lists.add(5);
Observable<Integer> observable = Observable.from(lists);
Subscription subscription = observable.subscribe(new Observer<Integer>() {
public void onCompleted() {
Log.i("123", "onCompleted: ");
}
public void onError(Throwable e) {
Log.i("123", "onError: ");
}
public void onNext(Integer integer) {
Log.i("123", "onNext : " + integer);
}
});</span>
from()
创建符可以从一个列表/数组来创建Observable,并一个接一个的从列表/数组中发射出来每一个对象,或者也可以从JavaFuture
类来创建Observable,并发射Future对象的.get()
方法返回的结果值。传入Future
作为参数时,我们可以指定一个超时的值。Observable将等待来自Future
的结果;如果在超时之前仍然没有结果回,Observable将会触发onError()
方法通知观察者有错误发生了。Observable.just()
Observable.just()方法主要用于将java对象转变为Observable对象发射出去。
<span style="font-size:14px;"> Observable<String> observable = Observable.just(getMessage());
Subscription subscription = observable.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i("123", "onNext : " + integer);
}
});</span>
just()
方法可以传入一到九个参数,它们会按照传入的参数的顺序发射。just()
方法也可以接受列表或数组,就像from()
方法,但是它不会迭代列表发射每个值,它将会发射整个列表。如果发射一组定义好的数据时采用此方式。just()
创建符,它发射出值后,Observable正常结束。