RxJava(新手推薦一)


title: RxJava(新手推薦一)

date: 2016-11-27 13:03:46

tags:

好久沒更新了凛捏,這段時間一直在翻譯一篇google官方關(guān)于Bitmap的文檔旨袒,浪費(fèi)了點時間仗扬。所以今天周末來公司給大家更新一篇關(guān)于RxJava的文章,希望對剛剛開始了解這塊的朋友有點幫助卓鹿。
關(guān)于RxJava的文章太多了房揭,剛開始看的時候真的是各種不理解箭阶,這到底有啥用啊。RxJava谚殊?函數(shù)響應(yīng)式編程丧鸯?各種疑問?別急嫩絮,讓我以一個小弱雞的視角給你講解丛肢。
首先說到RxJava围肥,就不得不說一種設(shè)計模式,觀察者模式蜂怎。關(guān)于觀察者模式穆刻,如果你還不是很懂,那么我的這篇文章你說不定會喜歡-->觀察者模式杠步。

好了氢伟,現(xiàn)在假設(shè)你懂了。

RxJava中主要包含兩部分(Observer和Observable)幽歼。

Observer: 觀察者朵锣,通常我們使用比較多的是(Subscribe,可以看成就是Observer)甸私。
Observable: 被觀察者(也可以看做Subject)猪勇。
記得當(dāng)時就因為employer(雇主),employee(職工)糾結(jié)了好久颠蕴。不要在意這個泣刹,不要讓一個本來很簡單的問題被英文繞的晦澀難懂。

當(dāng)Observable(Subject)的內(nèi)容發(fā)生變化時犀被,通知Observer執(zhí)行相應(yīng)的動作椅您。

原理很簡單,我們先來看看怎么用吧寡键。

一.如何引入RxJava

RxJava

Gradle引入方式如下(x,y,z為相應(yīng)的版本):

compile 'io.reactivex:rxjava:x.y.z'

Maven引入:

<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava</artifactId>
    <version>x.y.z</version>
</dependency>

在例子中掀泳,我用的開發(fā)環(huán)境是Android Studio,所以我選擇第一種方式西轩,我引入的是(io.reactivex:rxjava:1.0.14)员舵。

二.基本使用

1.創(chuàng)建Observable(被觀察者)
 Observable<String> observable = Observable.create(
new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {

            subscriber.onNext("Hello world");
        }
    });
2.創(chuàng)建Subscribe(觀察者)
Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
         
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            System.out.println(s);
        }
    };
3.完成訂閱動作
 observable.subscribe(subscriber);(不要糾結(jié)為什么是observable訂閱subscriber,按字面意思應(yīng)該是subscriber訂閱observable才對)藕畔。

好了马僻,一個最基本的RxJava的使用過程寫完了。

讓我們看看運(yùn)行結(jié)果:

結(jié)果

仔細(xì)看上面的代碼注服,我們的目的是在被觀察者中傳出一個字符串韭邓,然后在訂閱者subscriber中將該字符串打印出來。

那我們的代碼有沒有什么問題溶弟?

我們的需求是在訂閱者中打印出該字符串而已女淑,也就是我們只需要響應(yīng)onNext就可以,但是按照現(xiàn)在這種寫法辜御,我們需要重寫onNext鸭你,onCompleted以及onError,有點麻煩「ぞ蓿可不可以只需要寫一個方法阁谆?

當(dāng)然可以。于是就有了下面這種寫法瓣窄。

 Action1<String> onNextAction = new Action1<String>() {
        @Override
        public void call(String s) {

            System.out.println(s);
        }
    };

隨后笛厦,實現(xiàn)訂閱動作。

 observable.subscribe(onNextAction);

有疑問嗎俺夕?

這個Action1又是什么鬼裳凸?和Subscriber又是什么關(guān)系?別急劝贸,待我慢慢道來姨谷。看圖映九。

Action1

由圖可以看出梦湘,Subscriber中的每一步可以分別對應(yīng)一個Action1。我們只需要實現(xiàn)我們想要的動作件甥,然后訂閱就可以捌议。

如果我們想實現(xiàn)onNext,onError以及onCompleted引有。我們可以創(chuàng)建三個Action1對象瓣颅,然后在完成訂閱動作即可。

observable.subscribe(onNextAction,onErrAction,onCompleteAction)譬正。

訂閱者是簡化了宫补,但是我們的被觀察者Observable有沒有簡單的寫法呢?

當(dāng)然有曾我,我們可以雨露均沾的粉怕。

Observable<String> observable = Observable.just("Hello world");
Action1<String> onNextAction = new Action1<String>() {
        @Override
        public void call(String s) {

            System.out.println(s);
        }
    };
observable.subscribe(onNextAction);

那么,兩種創(chuàng)建Observable的方式有什么區(qū)別嗎抒巢?(先知道我們被觀察者Obervable已知的有兩種創(chuàng)建方式贫贝,區(qū)別我會在以后的文章中寫。一篇寫的話太長了虐秦,RxJava分為3平酿,4部分寫完)。

現(xiàn)在與以前相比悦陋,寫法上簡單太多,那么有沒有更簡單的寫法呢筑辨?

Observable.just("Hello world").subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            System.out.println(s);
        }
    });

這一步與以上相比俺驶,省去了好多臨時變量的創(chuàng)建,比如observable,顯得結(jié)構(gòu)更為簡潔暮现。那么有沒有更為簡單的寫法呢还绘?畢竟知足很難。是時候Lambda表達(dá)式登場了栖袋,如果你還不會這個表達(dá)式的寫法拍顷,那么完全可以跳過。這部分只是為了表現(xiàn)出函數(shù)響應(yīng)式編程的魅力塘幅。

  Observable.just("Hello world").subscribe(
           s -> System.out.println(s));

如果需求要變昔案,我們在Subscriber中要對傳出的數(shù)據(jù)進(jìn)行更改,那么怎么做呢电媳?

你可能會說踏揣,這還不簡單。我瞇著眼睛一看就知道有兩種匾乓。

(1)

Observable.just("Hello world str").subscribe(
           s -> System.out.println(s));

(2)

Observable.just("Hello world").subscribe(
           s -> System.out.println(s + "str"));

觀察實現(xiàn)(1)與實現(xiàn)(2)捞稿。

我們Observable將數(shù)據(jù)傳出時并不知道要做什么自定義的東西,所以方案(1)并不好拼缝。那么方式(2)呢娱局?
我們在訂閱者(Subscriber)中對實現(xiàn)進(jìn)行了更改,這是不合理的咧七,因為Subscriber是被動響應(yīng)的衰齐,為了結(jié)構(gòu)上的簡單,我們并不希望在訂閱者(Subscriber)中做太多東西猪叙。要是能在Observable和Subscriber中間做一些處理就好了娇斩。可以嗎穴翩?來看下RxJava中的Operators犬第。

Operators使用

 Observable.just("Hello world").map(new Func1<String, Object>() {
        @Override
        public Object call(String s) {
            return s+"str";
        }
    }).subscribe(s -> System.out.println(s));

對Func1使用Lambda的寫法如下:

Observable.just("Hello world")
            .map(s -> s+"str")
                .subscribe(s -> System.out.println(s));

可以看出我們在將事件傳出(just)與訂閱(subscribe)中間進(jìn)行了一些處理。

哎呦

處理又能怎么樣芒帕?與之前的兩種方式也沒啥區(qū)別啊歉嗓。這么想就是你的不對了,如果我們在中間的處理過程很多背蟆,類似于中間商層層剝皮呢鉴分?按照以前的寫法是不是就比較混亂,在一個里面處理了太多事情〈颍現(xiàn)在RxJava有了Operators志珍,我們就可以這么干。

    Observable.just("Hello world")
                .map(s -> s+"str")
                .map(s -> s + "i")
                .map(s -> s + "love")
                .map(s -> s + "you")
                .subscribe(s -> System.out.println(s));

心動嗎垛叨?當(dāng)我看到還可以這么用的時候伦糯,就差起立了。真幸福。我在中間想處理多少步就處理多少步敛纲。

RxJava的入門基本上完了喂击,那么學(xué)這些到底有什么用?來開始畫餅淤翔。

到底我們實際項目中翰绊,或者具體Android開發(fā)情境中到底該怎么用?
Observable與Subscriber的使用可以讓好多情況下的條理變得更加清晰直觀旁壮,比如Observable獲取網(wǎng)絡(luò)數(shù)據(jù)监嗜,在Subscriber中我們可以將數(shù)據(jù)顯示在UI上。原先我們用Thread+handler所做的一切寡具,現(xiàn)在都可以用RxJava結(jié)合其他一些開源組件秤茅,比如retrofit。

參考文檔:

RxJava入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末童叠,一起剝皮案震驚了整個濱河市框喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厦坛,老刑警劉巖五垮,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杜秸,居然都是意外死亡放仗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門撬碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诞挨,“玉大人,你說我怎么就攤上這事呢蛤』躺担” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵其障,是天一觀的道長银室。 經(jīng)常有香客問我,道長励翼,這世上最難降的妖魔是什么蜈敢? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮汽抚,結(jié)果婚禮上抓狭,老公的妹妹穿的比我還像新娘。我一直安慰自己造烁,他們只是感情好辐宾,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布狱从。 她就那樣靜靜地躺著膨蛮,像睡著了一般叠纹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敞葛,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天誉察,我揣著相機(jī)與錄音,去河邊找鬼惹谐。 笑死持偏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氨肌。 我是一名探鬼主播鸿秆,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怎囚!你這毒婦竟也來了卿叽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恳守,失蹤者是張志新(化名)和其女友劉穎考婴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催烘,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡沥阱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伊群。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考杉。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舰始,靈堂內(nèi)的尸體忽然破棺而出崇棠,到底是詐尸還是另有隱情,我是刑警寧澤蔽午,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布易茬,位于F島的核電站,受9級特大地震影響及老,放射性物質(zhì)發(fā)生泄漏抽莱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一骄恶、第九天 我趴在偏房一處隱蔽的房頂上張望食铐。 院中可真熱鬧,春花似錦僧鲁、人聲如沸虐呻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟叼。三九已至偶惠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朗涩,已是汗流浹背忽孽。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谢床,地道東北人兄一。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像识腿,于是被迫代替她去往敵國和親出革。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 我從去年開始使用 RxJava 渡讼,到現(xiàn)在一年多了骂束。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,472評論 7 62
  • 前言我從去年開始使用 RxJava 硝全,到現(xiàn)在一年多了栖雾。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,164評論 6 151
  • 文章轉(zhuǎn)自:http://gank.io/post/560e15be2dca930e00da1083作者:扔物線在正...
    xpengb閱讀 7,032評論 9 73
  • 黃堡文化研究 第5期作者:和小軍編輯:秦隴華 在我老家的村頭伟众,有一棵蒼虬蓊郁古槐析藕,軀干不高,卻有幾摟粗細(xì)凳厢。整個...
    primates閱讀 1,258評論 0 0
  • 最近又有了一次收獲账胧,那就是在業(yè)務(wù)大比武中取得了不俗的成績,獲得了能手的稱號先紫。 在復(fù)習(xí)迎考的時候治泥,多少次都想放棄了。...
    晦魄環(huán)照閱讀 177評論 0 0