【CSDN博客遷移】Android項目新架構(gòu)(1)—————RxJava

前言


我們的新項目采用了 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)注毅访。(下圖是一個類比圖)

觀察者模式類比圖.png

以上面的例子對照Java 8 API沮榜,看一下JAVA 的觀察者模式實現(xiàn):


jdk8 觀察者模式類圖.png

RxJava觀察者模式

先看一下RxJava的主要實現(xiàn)類圖

RxJava類圖.png

主要有三個步驟:

  • 創(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ù)式編程)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婆翔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掏婶,更是在濱河造成了極大的恐慌啃奴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄妥,死亡現(xiàn)場離奇詭異最蕾,居然都是意外死亡,警方通過查閱死者的電腦和手機老厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門瘟则,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梅桩,你說我怎么就攤上這事壹粟。” “怎么了宿百?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵趁仙,是天一觀的道長。 經(jīng)常有香客問我垦页,道長雀费,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任痊焊,我火速辦了婚禮盏袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄啥。我一直安慰自己辕羽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布垄惧。 她就那樣靜靜地躺著刁愿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪到逊。 梳的紋絲不亂的頭發(fā)上铣口,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音觉壶,去河邊找鬼脑题。 笑死,一個胖子當(dāng)著我的面吹牛铜靶,可吹牛的內(nèi)容都是我干的叔遂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掏熬!你這毒婦竟也來了佑稠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤旗芬,失蹤者是張志新(化名)和其女友劉穎舌胶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疮丛,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡幔嫂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了誊薄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履恩。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呢蔫,靈堂內(nèi)的尸體忽然破棺而出切心,到底是詐尸還是另有隱情,我是刑警寧澤片吊,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布绽昏,位于F島的核電站,受9級特大地震影響俏脊,放射性物質(zhì)發(fā)生泄漏全谤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一爷贫、第九天 我趴在偏房一處隱蔽的房頂上張望认然。 院中可真熱鬧,春花似錦漫萄、人聲如沸卷员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽子刮。三九已至,卻和暖如春窑睁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葵孤。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工担钮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤仍。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓箫津,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苏遥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容