RxJava ——基礎學習(一)

4個月前了解過一點點RxJava的皮毛,當時就經常看到Retrofit+MVP+RxJava這套組合,當時還在學校度過最后的時光,準備畢業設計,就也先看了一點,也寫了一個非常籠統的學習博客。Android入門學習——RxJava+Retrofit+MVP學習 ,相信我,你看了也不會有啥幫助,因為我當時寫的時候就啥都不會,門都沒入,寫的目的很大一部分是為了找工作能有額外的東西可說。: )

關于這套東西,我個人的建議是不要同時三個一起進行學習,尤其是新人,這套組合需要學的東西不少。對于和我一樣的新人,我建議如下的學習順序:

  1. 先學習MVP,這個入門最簡單
  2. 學習OkHttp。把常用的方法學習學習,入門也并不困難。Retrofit底層還是OkHttp,遇到問題或者想實現一些需求,有時還得看OkHttp的東西,先了解OkHttp對于學習Retrofit有比較好的幫助。可以把鴻洋大神封裝的OkHttpUtils敲了敲,學習一下怎么封裝的。
  3. 學習RxJava。這個入門最困難也最耗時,東西多,而且并不是很容易理解。新人一般Java基礎也不牢固,在學RxJava的時候,可以把Java的基礎再鞏固鞏固。
  4. 最后Retrofit

補充:
0.若不了解Java8增加的知識點,先學習Java8的stream流。能幫助理解RxJava的操作符。傳送門->Java8學習筆記


我的學習流程失誤。我是了解了Lambda之后直接開始學習的RxJava,學習了RxJava的基本知識后又學習的Java8,但我個人感覺還是先學習Java8的知識點比較好。

本人太菜,會出很多錯誤,望指正。

學習資料:
扔無線大神的給 Android 開發者的 RxJava 詳解
大頭鬼大神的深入淺出RxJava系列
GitHub上的ReactiveX/RxJava文檔中文版


1.HelloWord

用RxJava輸出一下永恒的HelloWord。這里先大概瀏覽一遍,看完整篇后,再來看一遍。

public class RxJava_Demo_1 {
    public static void main(String[] agrs) {
        rxHello();
    }

    public static void rxHello() {
        //觀察者
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {}
            @Override
            public void onError(Throwable e) {}
            @Override
            public void onNext(String s) {
                System.out.println(s);
            }
        };
        //被觀察者
        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello world_1");
                subscriber.onNext("Hello world_2");
                subscriber.onNext("Hello world_3");
            }
        });
        //訂閱
        observable.subscribe(observer);
    }
}


2.Observer(觀察者)與Observable(被觀察者)

  • Observer(觀察者)——對Observable發來的數據或者數據序列做出響應。大白話就是,執行Observable發來的事件,決定事件觸發的時候將有怎樣的行為

  • Observable(被觀察者)——它決定什么時候觸發事件以及觸發怎樣的事件。一般需要Observable訂閱(Subscribe)Observer之后起作用,才會發送事件。注意observable.subscribe(observer);

  • Subscriber(訂閱者)——特殊的觀察者,基本等價于Observer(觀察者)。但有差別。Observer是一個接口,Subscriber是一個實現了Observer的觀察者抽象類。但Subscriber實現的接口不只有Observer,還有另一個接口Subscription,這個接口它有一個unsubscribe()方法。至于SubscriberObserver的差別,目前只要曉得Subscriber增加了一個onStart()方法。


3.Subscribe(訂閱)方法與取消訂閱 (Unsubscribing)方法

subscribe()方法用于將觀察者連接到Observable。但,正確的打開方式是observable.subscribe(observer);并不是訂閱者(Observer)訂閱被訂閱者(Observable),而是難以理解的被訂閱者(Observable)來訂閱訂閱者(Observer)。好繞口,這里先死記住。扔無線大神解釋說“雖然更加符合思維邏輯,但對流式 API 的設計就造成影響了,比較起來明顯是得不償失的。”。嗯 ...,but what?新人還是不要太打破砂鍋問到底了。死記。

unsubscribing()方法就相對好理解。就是取消觀察者和被觀察者間的聯系。

調用這個方法表示你不關心當前訂閱的Observable了,因此Observable可以選擇停止發射新的數據項(如果沒有其它觀察者訂閱)。
取消訂閱的結果會傳遞給這個Observable的操作符鏈,而且會導致這個鏈條上的每個環節都停止發射數據項。這些并不保證會立即發生,然而,對一個Observable來說,即使沒有觀察者了,它也可以在一個while循環中繼續生成并嘗試發射數據項。

第二段,并不是很理解。是不是說,有時候Observablewhile循環中向Observer發送消息,取消訂閱有可能不會立即生效,ObservableObserver并沒有斷開聯系。也就是說盡量不要在while循環中使用Observable來發送消息?

另外,及時合理的調用unsubscribing()能夠減少內存泄露的問題。


4.Observer(觀察者)接口內的回調方法

  • onNext(T item)——被觀察者(Observable)調用這個方法來發送數據。參數就是發送的數據。對于這個方法的理解,不要太在意名字,并不是下一次執行的意思。可以參考著Iteratornext()開進行理解。個人的感覺就是“執行”。

  • onError(Exception ex)——被觀察者(Observable)遇到異常或者無法返回期望的而數據時,會調用這個方法。調用這個方法后,不會再調用onNext(T item)onComplete()方法

  • onComplete()——正常終止。被觀察者(Observable)最后一次調用onNext(T item)方法后調用這個方法。

根據Observable協議的定義,onNext可能會被調用零次或者很多次。

onError(Exception ex)onComplete()是勢不兩立的,不會同時執行,只會有一個被調用。


5.操作符列表,看看就成,有個大概的印象

RxJava難點之一,就是操作符眾多。而且大部分對新人來說并不好理解

1.創建操作—— Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer
2.變換操作—— Buffer, FlatMap, GroupBy, Map, Scan和Window
3.過濾操作—— Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take, TakeLast
4.組合操作—— And/Then/When, CombineLatest, Join, Merge, StartWith, Switch, Zip
5.錯誤處理—— Catch和Retry
6.輔助操作—— Delay, Do, Materialize/Dematerialize, ObserveOn, Serialize, Subscribe, SubscribeOn, TimeInterval, Timeout, Timestamp, Using
7.條件和布爾操作—— All, Amb, Contains, DefaultIfEmpty, SequenceEqual, SkipUntil, SkipWhile, TakeUntil, TakeWhile
8.算術和集合操作—— Average, Concat, Count, Max, Min, Reduce, Sum
9.轉換操作—— To
10.連接操作—— Connect, Publish, RefCount, Replay
11.反壓操作—— 用于增加特殊的流程控制策略的操作符

6. 最后

這幾個單詞,不敲幾遍還真記不住。
永恒的Hello World!已經打印出來了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容