RxJava ——基礎學習(一)

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

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

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

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


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

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

學習資料:
扔無線大神的給 Android 開發(fā)者的 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發(fā)來的數(shù)據(jù)或者數(shù)據(jù)序列做出響應。大白話就是,執(zhí)行Observable發(fā)來的事件,決定事件觸發(fā)的時候將有怎樣的行為

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

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


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

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

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

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

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

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


4.Observer(觀察者)接口內(nèi)的回調(diào)方法

  • onNext(T item)——被觀察者(Observable)調(diào)用這個方法來發(fā)送數(shù)據(jù)。參數(shù)就是發(fā)送的數(shù)據(jù)。對于這個方法的理解,不要太在意名字,并不是下一次執(zhí)行的意思??梢詤⒖贾?code>Iterator的next()開進行理解。個人的感覺就是“執(zhí)行”。

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

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

根據(jù)Observable協(xié)議的定義,onNext可能會被調(diào)用零次或者很多次。

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


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

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

1.創(chuàng)建操作—— 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!已經(jīng)打印出來了。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容