RxJava響應式函數編程
RxJava最核心的兩個東西是Observables(被觀察者,事件源)和subscribers(觀察者)。observables發出一系列事件,subscribers處理這些事件。
一個Observables可以發出零個或者多個事件,知道結束或者出錯。每發出一個事件,就會調用它的subscribee的onNext方法,最後調用subscribe.onNext()或者subscribe.onError()結束。
RxJava的看起來很像設計模式中的觀察者模式,但是有一點明顯不同,那就是如果一個Observerble沒有任何的Subscrible沒有任何的Subscriber,那麼這個Observable是不會發出任何事件的。
使用流程:
-
創建一個Observable對象
-
創建一個Subscriber對象處理Observable對象發出來的字符串
-
通過subscribe函數將定義的observable對象和subscribe對象關聯起來,完成subscribe對observable的訂閱
-
Observable<String> myObservable = Observable.create(
-
new Observable.OnSubscribe<String>() {
-
@Override
-
public void call(Subscriber<? super String> sub) {
-
sub.onNext("Hello, world!");
-
sub.onCompleted();
-
}
-
}
-
);
-
Subscriber<String> mySubscriber = new Subscriber<String>() {
-
@Override
-
public void onNext(String s) { System.out.println(s); }
-
-
@Override
-
public void onCompleted() { }
-
-
@Override
-
public void onError(Throwable e) { }
-
};
-
myObservable.subscribe(mySubscriber);
RxJava提供了很多便捷的函數來幫助我們減少代碼
簡化Observable對象的創建過程。RxJava內置了很多簡化創建Observable對象的函數,比如Observable.just()就是用來創建只發出一個事件就結束的Observable對象
-
Observable<String> myObservable = Observable.just("Hello, world!");
接着也有簡化Subscriber的,我們並不關心OnComplete和OnError,我們只需要在OnNext中作出以下處理,使用Action1類
-
Action1<String> onNextAction = new Action1<String>() {
-
@Override
-
public void call(String s) {
-
System.out.println(s);
-
}
-
};
subscribe方法有一個重載版本,接受三個Action1類型的參數,分別對應OnNext,OnComplete, OnError函數。
-
myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
這裏我們並不關心onError和onComplete,所以只需要第一個參數就可以
-
myObservable.subscribe(onNextAction);
-
// Outputs "Hello, world!"
代碼最終可以寫成這樣
-
Observable.just("Hello, world!")
-
.subscribe(new Action1<String>() {
-
@Override
-
public void call(String s) {
-
System.out.println(s);
-
}
-
});
使用java8的lambda可以使代碼更簡潔
-
Observable.just("Hello, world!")
-
.subscribe(s -> System.out.println(s));
Android開發中,強烈推薦使用retrolambda這個gradle插件,這樣你就可以在你的代碼中使用lambda了。
操作符(Operators)
操作符就是爲了解決Observable對象的變換的問題,操作符用於在Observable和最終的Subscriber之間修改Observable發出的事件。RxJava提供了很多有用的操作符。
例如map操作符,用來把一個事件轉換成爲另外一個事件的。
-
Observable.just("Hello, world!")
-
.map(new Func1<String, String>() {
-
@Override
-
public String call(String s) {
-
return s + " -Dan";
-
}
-
})
-
.subscribe(s -> System.out.println(s));
使用lambda可以簡化的寫成
-
Observable.just("Hello, world!")
-
.map(s -> s + " -Dan")
-
.subscribe(s -> System.out.println(s));
map操作符進階
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)));
-
2、lambda使用方式
-
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));