RxJava正在Android开发者中变的越来越流行。现在项目中运用到,所以也深入学习。软件这行嘛,特别是程序猿,学习能力要跟上。废话不多说,直接开始。总的概括是:Rxjava就是设计模式中的观察者模式。
基础
RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者)。Observables发出一系列事件。Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据。。。),Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。
之前也说了:Rxjava就是设计模式中的观察者模式。那么如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会发出任何事件的。
入门HelloWorld
创建一个Observable对象很简单,直接调用Observable.create即可
Observable myObservable = Observable.create(这里定义的Observable对象仅仅发出一个Hello World字符串,然后就结束了。接着我们创建一个Subscriber来处理Observable对象发出的字符串。
newObservable.OnSubscribe() {
public void call(Subscriber<? super String > sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
Subscriber mySubscriber =newSubscriber() {
public void onNext(String s) { System.out.println(s); }
public void onCompleted() { }
public void onError(Throwable e) { }
}
这里subscriber仅仅就是打印observable发出的字符串。通过subscribe函数就可以将我们定义的myObservable对象和mySubscriber对象关联起来,这样就完成了subscriber对observable的订阅。
myObservable.subscribe(mySubscriber);一旦mySubscriber订阅了myObservable,myObservable就是调用mySubscriber对象的onNext和onComplete方法,mySubscriber就会打印出Hello World!
看到这里大家会说:就一个Hello World 特么就要了那么多代码,何来简洁,简直是加重了代码行数。但是您耐心观察你就会发现,RxJava 的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。(这个大家慢慢体会哈)。
下面我们来个更简单的更简洁的代码实现:
RxJava内置了很多简化创建Observable对象的函数,比如Observable.just就是用来创建只发出一个事件就结束的Observable对象,上面创建Observable对象的代码可以简化为一行:
Observable myObservable = Observable.just("Hello, world!");
你们看少了create 那坨代码吧,是不是越来越爽呢?
接下来看看如何简化Subscriber,上面的例子中,我们其实并不关心OnComplete和OnError,我们只需要在onNext的时候做一些处理,这时候就可以使用Action1类。
Action1 onNextAction =newAction1() {
public void call(String s) {
System.out.println(s);
}
}
subscribe方法有一个重载版本,接受三个Action1类型的参数,分别对应OnNext,OnComplete, OnError函数。
这里我们并不关心onError和onComplete,所以只需要第一个参数就可以
myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
myObservable.subscribe(onNextAction);
所以最终的写法:
Observable.just("Hello, world!")今天的基础就讲解到这里。下一章我会详细RxJava用法以及操作符(Operators)
.subscribe(newAction1() {
public void call(String s) {
System.out.println(s);
}
});
网友评论