版權聲明:本文爲openXu原創文章【openXu的博客】,未經博主允許不得以任何形式轉載
目錄:
一. 簡介
ReactiveX是Reactive Extensions
的縮寫,一般簡寫爲Rx,最初是LINQ的一個擴展,由微軟的架構師Erik Meijer領導的團隊開發,在2012年11月開源,Rx是一個編程模型,目標是提供一致的編程接口,幫助開發者更方便的處理異步數據流,Rx近幾年越來越流行了,現在已經支持幾乎全部的流行編程語言了,Rx的大部分語言庫由ReactiveX這個組織負責維護,比較流行的有RxJava/RxJS/Rx.NET。
Rx是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX結合了觀察者模式、迭代器模式和函數式編程的精華。Rx是一個函數庫,讓開發者可以利用可觀察序列和LINQ風格查詢操作符來編寫異步和基於事件的程序,使用Rx,開發者可以用Observables表示異步數據流,用LINQ操作符查詢異步數據流, 用Schedulers參數化異步數據流的併發處理。
RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(觀察者)。Observables發出一系列事件,Subscribers處理這些事件。這裏的事件可以是任何你感興趣的東西(觸摸事件,web接口調用返回的數據)
一個Observable可以發出零個或者多個事件,直到結束或者出錯。每發出一個事件,就會調用它的Subscriber的onNext方法,最後調用Subscriber.onNext()或者Subscriber.onError()結束。
Rxjava的看起來很想設計模式中的觀察者模式,但是有一點明顯不同,那就是如果一個Observerble沒有任何的的Subscriber,那麼這個Observable是不會發出任何事件的。
二. 簡單使用
Rx是一種編程模型,幫助開發者更方便的處理異步任務,Rx庫現在已經支持幾乎全部的主流編程語言了,並且它提供一致的編程接口。接下來的學習以Android平臺爲例,首先我們要導入依賴庫:
compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'
RxJava和RxAndroid的GitHub地址如下:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
1. 初步探索
private void showToast(String s){
Toast.makeText(mContext, s, Toast.LENGTH_SHORT).show();
}
/**
* 初步探索
*/
private void rx_1() {
//創建一個Observable對象很簡單,直接調用Observable.create即可
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello, RxAndroid!");
sub.onCompleted();
}
}
);
//創建一個Subscriber來處理Observable對象發出的字符串
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
showToast(s);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
};
/*
* 通過subscribe函數就可以將我們定義的myObservable對象和mySubscriber對象關聯起來;
* 這樣就完成了subscriber對observable的訂閱
* 一旦mySubscriber訂閱了myObservable,myObservable就是調用mySubscriber對象的onNext和onComplete方法,mySubscriber就會打印出Hello World
*/
myObservable.subscribe(mySubscriber);
}
2. 代碼簡化
RxJava其實提供了很多便捷的函數來幫助我們減少代碼,後面的博客中會詳細的學習這些API。這裏還用到了一點小知識:Android開發中,強烈推薦使用retrolambda這個gradle插件,這樣你就可以在你的代碼中使用lambda了,不瞭解的可以參考博客:http://blog.csdn.net/xmxkf/article/details/51532028
private void rx_2() {
//①.使用RxJava提供的便捷函數來減少代碼
//創建Observable對象的代碼可以簡化爲一行
Observable<String> myObservable = Observable.just("Hello, RxAndroid!");
//簡化Subscriber:上面的例子中,我們其實並不關心OnComplete和OnError,
//我們只需要在onNext的時候做一些處理,這時候就可以使用Action1類
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
showToast(s);
}
};
//subscribe方法有一個重載版本,接受三個Action1類型的參數,分別對應OnNext,OnComplete, OnError函數
//myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
//這裏我們並不關心onError和onComplete,所以只需要第一個參數就可以
myObservable.subscribe(onNextAction);
//②.上面的代碼最終可以寫成這樣
Observable.just("Hello, RxAndroid!")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
showToast(s);
}
});
//③.使用java8的lambda可以使代碼更簡潔
//關於Lambda語法可以看看這篇博客:http://blog.csdn.net/xmxkf/article/details/51532028
Observable.just("Hello, RxAndroid!")
.subscribe(s -> showToast(s));
}
3. 操作符(Operators)
private void rx_3() {
/*
* ①.我想在Hello, RxAndroid!後面加上一段簽名,你可能會想到去修改Observable對象:
*/
Observable.just("Hello, RxAndroid! -openXu")
.subscribe(s -> showToast(s));
/*
* 如果我的Observable對象被多個Subscriber訂閱,但是我只想在對某個訂閱者做修改呢?
*/
Observable.just("Hello, RxAndroid!")
.subscribe(s -> showToast(s + " -openXu"));
/*
* ②. 操作符(Operators)
* 根據響應式函數編程的概念,Subscribers更應該做的事情是“響應”,響應Observable發出的事件,而不是去修改
* 所以我們應該在某些中間步驟中對"Hello, RxAndroid!"進行變換
*
* 操作符就是爲了解決對Observable對象的變換的問題,
* 操作符用於在Observable和最終的Subscriber之間修改Observable發出的事件。
* RxJava提供了很多很有用的操作符,比如map操作符,就是用來把把一個事件轉換爲另一個事件的。
*/
Observable.just("Hello, RxAndroid!")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s + " -openXu";
}
})
.subscribe(s -> showToast(s));
//使用lambda可以簡化爲
Observable.just("Hello, RxAndroid!")
.map(s -> s + " -openXu")
.subscribe(s -> showToast(s));
/*
* ③. map操作符進階
* map操作符更有趣的一點是它不必返回Observable對象返回的類型;
* 你可以使用map操作符返回一個發射新的數據類型的observable對象。
* 比如上面的例子中,subscriber並不關心返回的字符串,而是想要字符串的hash值
*/
Observable.just("Hello, RxAndroid!")
.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
})
.subscribe(i -> showToast(Integer.toString(i)));
//我們初始的Observable返回的是字符串,最終的Subscriber收到的卻是Integer,使用lambda可以進一步簡化代碼
Observable.just("Hello, RxAndroid!")
.map(s -> s.hashCode())
.subscribe(i -> showToast(Integer.toString(i)));
//Subscriber做的事情越少越好,我們再增加一個map操作符
Observable.just("Hello, RxAndroid!")
.map(s -> s.hashCode())
.map(i -> Integer.toString(i))
.subscribe(s -> showToast(s));
}
就體驗到這裏,後面一系列博客會帶大家學習RxJava的各種操作符,如果有疑問請留言,對您有幫助請點贊喔~