前言
最近在學習RxJava的過程中,越發感受到這個框架的強大,對於提升開發效率,降低維護成本有很大的作用。有必要強行安利一波,一起來看看RxJava簡介,基本概念,原理與使用,本篇主要介紹RxJava的簡介。
響應式程式設計ReactiveX
RxJava是ReactiveX中使用Java語言實現的版本,那什麼是ReactiveX呢?ReactiveX就是一種新興的程式設計模式--響應式程式設計,定義為一種基於非同步資料流概念的程式設計模式,可分解為"觀察者模式+迭代器模式+函數語言程式設計"。
擴充套件的觀察者模式
有關觀察者模式的概念不懂得童鞋可自行google,這裡就不再贅述。RxJava擴充套件了觀察者模式,通過使用可觀察的物件序列流來表述一系列事件,訂閱者進行佔點觀察並對序列流做出反應(或持久化或輸出顯示等等);借鑑迭代器模式,對多個物件序列進行迭代輸出,訂閱者可以依次處理不同的物件序列;使用函數語言程式設計思想,簡化繁瑣的邏輯程式碼。
而RxJava的核心便是被觀察者Observables與觀察者Observer,由Observables發出一系列的事件,Observer通過subscribe()方法進行訂閱接收事件並進行處理,類似觀察者模式,不同之處在於,若沒有觀察者,被觀察者是不會發出任何事件的。
所以說,RxJava本質上是一個非同步操作庫,是一個能讓你用極其簡潔的邏輯去處理繁瑣複雜任務的非同步事件庫。
例子
概念理解起來未免晦澀難懂,我們來看一個例子:
有這樣一個需求:開發一個類似房天下的App,某功能需要檢索出某一片區所有住宅小區中購房總價<200W的房源並展示出來。先看原始實現方式:
new Thread(new Runnable() {
@Override
public void run() {
//獲取要查詢的小區集合
List<Community> communities = getCommunities();
for (Community community : communities) {
//獲取小區中的房源集合
List<House> houses = community.getHouses();
for (House house : houses) {
if (house.getPrice() < 200) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//顯示查詢出來的房源資訊
ShowSearchedHousesMessage();
}
});
}
}
}
}
}).start();複製程式碼
RxJava實現方式:
//獲取要查詢的小區集合
List<Community> communities = getCommunities();
Observable.from(communities)
.flatMap(new Func1<Community, Observable<House>>() {
@Override
public Observable<House> call(Community community) {
return Observable.from(community.getHouses());
}
})
.filter(new Func1<House, Boolean>() {
@Override
public Boolean call(House house) {
return house.getPrice() < 200;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<House>() {
@Override
public void call(House house) {
//顯示查詢出來的房源資訊
ShowSearchedHousesMessage();
}
});複製程式碼
RxJava的實現方式看上去更復雜了,但是它的邏輯很清晰簡潔,修改起來很方便,後期維護起來也能提高工作效率。再來看下配合Lambda表示式:
//獲取要查詢的小區集合
List<Community> communities = getCommunities();
Observable.from(communities)
.flatMap(community -> Observable.from(community.getHouses())
.filter(house -> house.getPrice() < 200)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(house -> ShowSearchedHousesMessage());複製程式碼
搭配上Lambda表示式,程式碼的簡潔度是不是更上一層樓呢?不懂Lambda表示式的童鞋可以跳轉到我寫的另一篇講解Lambda表示式的文章:
Android開發之Lambda表示式基本語法與應用
總結
到此,本篇關於RxJava的簡介就介紹完畢了,本篇的目的主要是給大家引入一個RxJava的概念,以便後期更輕鬆的理解RxJava的原理與運作。下一篇我們再來一起詳細研究RxJava的原理及如何使用。
技術渣一枚,有寫的不對的地方歡迎大神們留言指正,有什麼疑惑或者建議也可以在我Github上RxJavaDemo專案Issues中提出,我會及時回覆。附上RxJavaDemo的地址:
RxJavaDemo