rxjava是一个使用观察者序列实现的基于事件的异步响应库。
笔者rxjava总结基于rxjava1,rxjava2相比于rxjava1变动还是蛮大的。引入rxjava1:
compile 'io.reactivex:rxjava:1.3.0'
1.我对rxjava的理解
与其说rxjava是一个响应式异步操作库,我更愿意将之理解为一种响应式编程的思想,它打破了我们流程式编码的习惯。
对于Android开发人员来说,异步操作以及回调的思想都不陌生。View的点击事件绑定,网络请求数据的回调等等,通常我们都使用接口的方式实现异步方法的回调。rxJava就是针对异步事件的响应式编程库,可以很好的解决Android编码中异步事件的监听处理,这也是为什么rxJava系列的库能在Android领域如此火爆。
2.我对rxjava的总结
在学习使用rxJava过程中会遇到很多阻碍,首先我们需要理解响应式编程思想,说白了就是Android中的回调;其次我们要了解观察者模式,也就是被观察者要在数据或业务变更的时候通知其绑定的所有观察者,观察者就可以实时的监听被观察者的动向。网上学习rxJava的文章也很多,我这里并不想对Rxjava的所有知识进行总结,我只是完全从应用的角度出发去理解rxjava。
学习rxJava首先需要搞懂3个概念:
- Observable,被观察者。也就是事件源,被观察者的行为变更才会引起观察者的回调监听;
- Subscriber,观察者。当被观察者行为变更的时候,其观察者会执行监听方法。
- subscribe,订阅动作。//被观察者订阅观察者.被观察者告诉观察者发生变化了,观察者执行对应的方法。(注:可能刚开始理解会有点别扭,但是站在代码角度,你会非常好理解。代码并不具备主观能动性,因此代码通过被观察者中的观察者去发布相应的事件来实现其回调方法的监听)
3.实例
实例一
下面代码是最简单直接的Rxjava的使用。
public static void main(String[] args){
//创建一个被观察者
Observable<String> strObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world!");
subscriber.onCompleted();
}
});
//观察者
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String o) {
System.out.println(o);
}
};
strObservable.subscribe(mySubscriber);//被观察者订阅观察者.被观察者告诉观察者发生变化了,观察者执行对应的方法
}
创建被观察者,观察者,二者进行绑定。创建被观察者的时候会执行其Call方法,Call方法中持有被观察者中拥有的观察者对象;Rxjava中观察者都会有onCompleted()、onError()、onNext()方法;这样,当被观察者订阅观察者的时候,被观察者会执行其call方法,call方法中我简单的进行了观察者方法的调用,这样就会执行观察者的对应方法。
实例二
具体使用中,我们很少会用上面的流程去进行实现(毕竟看上去太啰嗦,不但没有简化代码,反而使代码看起来复杂了很多)。
private void test1(){
//创建一个被观察者,just方式创建
Observable<String> strObservable = Observable.just("Hello world!");
//观察者,Action是继承Subscriber的
Action1<String> action1 = new Action1<String>() {
@Override
public void call(String s) {
System.out.print(s);
}
};
strObservable.subscribe(action1);//被观察者订阅观察者.被观察者告诉观察者发生变化了,观察者执行对应的方法
}
这里我们简化了被观察者对象和观察者对象的创建。Rxjava提供了多种方式创建观察者和被观察者对象,我们通常用just()方法去创建被观察者,用Action1替换观察者(其实Action1是继承了Subscriber,为了简化代码我们通常用Action1)。
实例三
我们继续对上面的代码进行简化
private void test2(){
Observable.just("Hello world!")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
}
这才是Rxjava的正确打开方式有木有。
实例四
前面被观察者的事件源都是字符串数据,我们希望传递其他数据,比如多个字符串:
/**
* just 发送多个T,Subscriber会依次处理
*/
private void test3(){
Observable.just("wang","jie")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
}
比如一个list:
/**
* from()发送一个集合
* */
private void test4(){
List<String> list = new ArrayList<>();
list.add("篮球");
list.add("足球");
list.add("乒乓球");
Observable.from(list)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
}
实例五
除此之外,其实Rxjava提供了很多观察者和被观察者的实例化方法供开发者进行使用。下面是一个定时创建被观察者的实例,可用作定时器的实现:
/**
* .使用interval( ),创建一个按固定时间间隔发射整数序列的Observable,可用作定时器:
*/
private void test6(){
Observable.interval(1, TimeUnit.SECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("每间隔" + aLong + "s发送一次");
}
});
}
介绍到这里,相信我们对RxJava已经有了一个基础的认识。接下来会继续对rxjava的使用进行分析。
欢迎大家留言讨论。