RxJava在Android开发中越来越流行,RxJava最核心的两个东西是Observables(被观察者、事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件,这里的事件可以是任何你感兴趣的东西,比如触摸事件、web接口调用返回的数据等。
基础
Observable可以发出多个事件,知道结束或者出错。每发出一个事件,就会调用与它绑定的Subscriber的onNext方法。最后调用Subscriber.onNext()或者Subscriber.onError()结束
Rxjava看起来很像设计模式中的观察者模式,但是有一点明显不同,那就是如果一个Observable没有任何Subscriber,那么这个Observable是不会发出任何事件的。
- Hello World案例
//创建一个Observable对象,直接调用Observable.create即可
Observable<String> mObservable = Observable.create( new Observable.onSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello world");
sub.onCompleted();
}
};
这里定义的Observable对象仅仅发出一个hello world字符串,然后就结束了。然后我们创建一个Subscriber来处理Observable对象发出的字符串
Subscriber<String> mySubsriber = new Subscriber<String>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable throwable) { }
@Override
public void onNext(String s) {
system.out.println(s);
}
};
myObservable.subscribe(mySubsriber);
这里subsriber仅仅就是打印Observable发出的字符串,通过subscribe函数可以将我们定义的myObservable对象和mySubscriber对象关联起来,这样就完成Subscriber和Observable的订阅。一旦订阅后,myObservable就会调用mySubscriber对象onNext和onComplete方法,mySubscriber就会打印出Hello world。
等价于
Rxjava其实提供了很多便捷函数来帮助我们来减少代码。
1.利用Observable.just创建只发出一个事件就结束的Observable对象。
Observable<String> mOb = Observable.just("hello world");
2.接下来简化Subscriber,其实我们关心的是onNext的一些处理。可以使用Action1类。
subscribe有一个重载方法,接受三个Action1类型的参数,分别对应onNext、onComplete、onError函数;
myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
最终简化代码
Observable.just("hello world").subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
或者使用java8的ambda使代码更简洁
Observable.just("hello world").subscribe(s -> System.out.println(s));
Android开发中,强烈推荐使用retrolambda这个gradle插件,这样你就可以在你的代码中使用lambda了。
操作符
操作符就是为了解决对Observable对象的变换问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。Rxjava提供了很多很有用的操作符。
- map操作符:用来把一个事件转换为另一个事件
//打印Hello world -Dan
Observable.just("hello world")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s + " -Dan";
}
}).subscribe(s -> System.out.print(s));
或
Observable.just("hello world").map(s -> s + " -Dan").subscribe(s -> System.out.print(s));
map()操作符就是用于变换Observable对象的,map操作符返回一个Observable对象,在一个Observable对象上可以多次使用map操作符,最终把最简洁的数据传递给Subscriber对象。map操作符更有趣的一点是它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。
Observable.just("Hello, world!")
.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
})
.subscribe(i -> System.out.println(Integer.toString(i)));
OR
Observable.just("Hello, world!")
.map(s -> s.hashCode())
.subscribe(i -> System.out.println(Integer.toString(i)));
前面说过,Subscriber做的事情越少越好,我们再增加一个map操作符
Observable.just("Hello, world!")
.map(s -> s.hashCode())
.map(i -> Integer.toString(i))
.subscribe(s -> System.out.println(s));
总结
1.Observable和Subscriber可以做任何事情
Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。
2.Observable和Subs是独立于中间的变换过程
在Observable和Subscriber中间可以增减任何数量map,整个系统是高度可组合的,操作数据是一个很简单的过程。
网友评论