前言
我們的新項目采用了 Android 10 大神的Android Clean Architecture 架構(gòu)模式器一,目前項目已經(jīng)基本結(jié)束课锌,現(xiàn)在回過頭來,梳理一下項目的新架構(gòu)盹舞,
為了梳理這個架構(gòu)产镐,我們必須先介紹幾個Android端的新技術(shù)——Rxjava,RxAndroid(響應(yīng)式編程庫)踢步,Retrofit(網(wǎng)絡(luò)請求庫),Dagger2(依賴注入庫),計劃寫四篇博客:
- 針對Android開發(fā)者Rxjava,RxAndroid
- Retrofit
- Dagger2
- Android Clean Architecture
這篇文章首先了解一下針對Android開發(fā)者的RxJava丑掺。
在正文開始之前获印,推薦一篇目前Google搜索排名No.1的Rxjava文章:給 Android 開發(fā)者的 RxJava 詳解,講的很好街州。
RxJava官網(wǎng)介紹
GitHub主頁描述如下:
"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成異步的兼丰、基于事件的程序的庫)。
上面的話去掉定語就是RxJava的核心唆缴,一個是異步鳍征,一個是基于事件編程(也叫響應(yīng)式編程)。定語是可觀測序列面徽,也就說RxJava是用一種類似觀察者模式實現(xiàn)的(注意是類似艳丛,后面會專門分析實現(xiàn)原理)。
異步
AsyncTask 和 Handler是Android開發(fā)者最常用的異步請求庫趟紊,但是代碼邏輯復(fù)雜氮双,后期維護成本高,相比較而言霎匈,RxJava的代碼邏輯清晰戴差,簡介,維護成本大大降低铛嘱。例子可以參考《給 Android 開發(fā)者的 RxJava 詳解》這篇文章的“RxJava 好在哪”部分暖释;響應(yīng)式編程(事件流編程)
除了上邊的異步袭厂,RxJava還有一層意思就是響應(yīng)式編程,目前編程模式主要有兩種球匕,一種是命令式編程(Imperative programming)嵌器,一種是函數(shù)響應(yīng)式編程,
我們經(jīng)常用的面向?qū)ο缶幊叹蛯儆诿钍骄幊獭?/p>
命令式編程是面向計算機硬件的抽象谐丢,有變量(對應(yīng)著存儲單元)爽航,賦值語句(獲取,存儲指令)乾忱,表達式(內(nèi)存引用和算術(shù)運算)和控制語句(跳轉(zhuǎn)指令)讥珍,一句話,命令式程序就是一個馮諾依曼機的指令序列窄瘟。 ————————用心閣
響應(yīng)式編程是面向數(shù)學(xué)的抽象衷佃,類似于我們數(shù)學(xué)意義上的函數(shù),是與異步數(shù)據(jù)(事件)流交互的編程模式蹄葱,其中變量氏义、復(fù)制語句、表達式图云、控制語句惯悠、數(shù)據(jù)結(jié)構(gòu)都是不可變的,都可以作為數(shù)據(jù)流竣况。
由于不變性克婶,使得響應(yīng)式編程與命令式編程相比最大的優(yōu)點是:
響應(yīng)式編程,由于(多個線程之間)不共享狀態(tài)丹泉,不會造成資源爭用(Race condition)情萤,也就不需要用鎖來保護可變狀態(tài),也就不會出現(xiàn)死鎖摹恨,這樣可以更好地并發(fā)起來筋岛,尤其是在對稱多處理器(SMP)架構(gòu)下能夠更好地利用多個處理器(核)提供的并行處理能力∩购澹————————用心閣
RxJava實現(xiàn)原理
前面說到Rx系列庫都是采用一種擴展的觀察者模式實現(xiàn)睁宰。我們首先用Java語言簡單說明一下觀察者模式。再詳細說明RxJava的擴展觀察者模式揩晴。
觀察者模式
我們以關(guān)注微信公眾號為例勋陪,做個說明:
- 1.Android技術(shù)大牛開個了個微信公眾號,主要介紹andorid新技術(shù)硫兰;
- 2.小楊,小王想看公眾號的文章诅愚,必須先關(guān)注這個公眾號;
- 3.只要公眾號有新的文章,就會立即向小楊推送文章违孝;
- 4.過了一段時間刹前,小楊和小王發(fā)現(xiàn)公眾號內(nèi)面的技術(shù)文章越寫越濫,不想看了雌桑,就取消了關(guān)注喇喉;
下面來看這個模式的定義:
觀察者模式定義了一個一對多的依賴關(guān)系,讓一個或多個觀察者對象監(jiān)聽一個主題對象校坑。這樣一來拣技,當(dāng)被觀察者狀態(tài)發(fā)生改變時,需要通知相應(yīng)的觀察者耍目,使這些觀察者對象能夠自動更新膏斤。 —————《Head First設(shè)計模式》
上面的觀察者對應(yīng)小楊和小王,主題對象就大牛的微信公眾號邪驮,主題(被觀察者)的狀態(tài)就是公眾號的文章更新莫辨,通知觀察者就是推送文章,觀察者自動更新就是關(guān)注或者取消關(guān)注毅访。(下圖是一個類比圖)
以上面的例子對照Java 8 API沮榜,看一下JAVA 的觀察者模式實現(xiàn):
RxJava觀察者模式
先看一下RxJava的主要實現(xiàn)類圖
主要有三個步驟:
- 創(chuàng)建 Observer(觀察者)
一般繼承Subscriber這個抽象類去實現(xiàn),Subscriber類除了繼承onNext()喻粹,onCompleted()蟆融,onError()三個事件外,還有unsubscribe()方法磷斧,用來取消訂閱振愿。 - 通過Observable(被觀察者)的create(OnSubscribe)方法創(chuàng)建被觀察者
這里傳入的OnSubscribe參數(shù)中call()方法,當(dāng)觀察者被訂閱的時候調(diào)用弛饭。 - 訂閱
在創(chuàng)建Observable和Observer 基礎(chǔ)之上,需要訂閱subscribe()方法萍歉,連接起來侣颂。
有人可能會注意到, subscribe() 這個方法有點怪:它看起來是『observalbe 訂閱了 observer / subscriber』而不是『observer / subscriber 訂閱了 observalbe』枪孩,這看起來就像『雜志訂閱了讀者』一樣顛倒了對象關(guān)系憔晒。這讓人讀起來有點別扭,不過如果把 API 設(shè)計成 observer.subscribe(observable) / subscriber.subscribe(observable) 蔑舞,雖然更加符合思維邏輯拒担,但對流式 API 的設(shè)計就造成影響了,比較起來明顯是得不償失的攻询。 ————拋物線
RxJava簡單使用
在上文的原理基礎(chǔ)上从撼,我們寫個簡單的例子
- 1.創(chuàng)建 Subscriber(觀察者)
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) { }
};
- 2.創(chuàng)建Observable(被觀察者)
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
- 3.訂閱subscribe()
myObservable.subscribe(mySubscriber);
// Outputs "Hello, world!"
總結(jié)
RxJava的事件序列變換,目前很沒理解透徹钧栖,后續(xù)補上這部分內(nèi)容低零。
參考文獻
1.https://gist.github.com/staltz/868e7e9bc2a7b8c1f754(英文)
2.https://github.com/hehonghui/android-tech-frontier/tree/master/androidweekly/ 那些年我們錯過的響應(yīng)式編程(翻譯)
3.http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
4.https://www.zhihu.com/question/28292740/answer/40336090 用心閣(函數(shù)式編程)