4個月前了解過一點點RxJava的皮毛,當時就經常看到Retrofit+MVP+RxJava
這套組合,當時還在學校度過最后的時光,準備畢業設計,就也先看了一點,也寫了一個非常籠統的學習博客。Android入門學習——RxJava+Retrofit+MVP學習 ,相信我,你看了也不會有啥幫助,因為我當時寫的時候就啥都不會,門都沒入,寫的目的很大一部分是為了找工作能有額外的東西可說。: )
關于這套東西,我個人的建議是不要同時三個一起進行學習,尤其是新人,這套組合需要學的東西不少。對于和我一樣的新人,我建議如下的學習順序:
- 先學習MVP,這個入門最簡單
- 學習
OkHttp
。把常用的方法學習學習,入門也并不困難。Retrofit
底層還是OkHttp
,遇到問題或者想實現一些需求,有時還得看OkHttp
的東西,先了解OkHttp
對于學習Retrofit
有比較好的幫助。可以把鴻洋大神封裝的OkHttpUtils敲了敲,學習一下怎么封裝的。 - 學習
RxJava
。這個入門最困難也最耗時,東西多,而且并不是很容易理解。新人一般Java基礎也不牢固,在學RxJava
的時候,可以把Java的基礎再鞏固鞏固。 - 最后
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()
方法。至于Subscriber
和Observer
的差別,目前只要曉得Subscriber
增加了一個onStart()
方法。
3.Subscribe(訂閱)方法與取消訂閱 (Unsubscribing)方法
subscribe()
方法用于將觀察者連接到Observable。但,正確的打開方式是observable.subscribe(observer);
并不是訂閱者(Observer
)訂閱被訂閱者(Observable
),而是難以理解的被訂閱者(Observable
)來訂閱訂閱者(Observer
)。好繞口,這里先死記住。扔無線大神解釋說“雖然更加符合思維邏輯,但對流式 API 的設計就造成影響了,比較起來明顯是得不償失的。”。嗯 ...,but what?新人還是不要太打破砂鍋問到底了。死記。
unsubscribing()
方法就相對好理解。就是取消觀察者和被觀察者間的聯系。
調用這個方法表示你不關心當前訂閱的Observable了,因此Observable可以選擇停止發射新的數據項(如果沒有其它觀察者訂閱)。
取消訂閱的結果會傳遞給這個Observable的操作符鏈,而且會導致這個鏈條上的每個環節都停止發射數據項。這些并不保證會立即發生,然而,對一個Observable來說,即使沒有觀察者了,它也可以在一個while循環中繼續生成并嘗試發射數據項。
第二段,并不是很理解。是不是說,有時候Observable
在while
循環中向Observer
發送消息,取消訂閱有可能不會立即生效,Observable
和Observer
并沒有斷開聯系。也就是說盡量不要在while
循環中使用Observable
來發送消息?
另外,及時合理的調用unsubscribing()
能夠減少內存泄露的問題。
4.Observer(觀察者)接口內的回調方法
onNext(T item)
——被觀察者(Observable)調用這個方法來發送數據。參數就是發送的數據。對于這個方法的理解,不要太在意名字,并不是下一次執行的意思。可以參考著Iterator
的next()
開進行理解。個人的感覺就是“執行”。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!
已經打印出來了。