一年前莱没,自己搭建項目框架的時候,就已經(jīng)接觸用過RxJava酷鸦,并且還和Retrofit結合一起使用郊愧。然而卻并不清楚RxJava,到底是個啥子東西井佑,只知道按摸就樣的用著属铁。網(wǎng)上有篇文章對RxJava介紹很詳細 拋物線大神 ,一年前看這篇文章和現(xiàn)在看躬翁,有不同的收獲吧焦蘑。
那到底啥是RxJava? 官方介紹
a library for composing asynchronous and event-based programs by using observable sequences.
It extends the observer pattern to support sequences of data/events and adds operators
that allow you to compose sequences together declaratively
while abstracting away concerns about things
like low-level threading, synchronization, thread-safety and concurrent data structures.
英語捉急,只能借助有道爸爸:
使用可觀察的序列來編寫異步和基于事件的程序的庫盒发。
它擴展了觀察者模式例嘱,以支持數(shù)據(jù)/事件的序列狡逢,并添加操作符,
使您能夠在抽象地消除對低層次線程拼卵、同步奢浑、線程安全和并發(fā)數(shù)據(jù)結構的關注時,以聲明的方式組合這些序列腋腮。
還是看不懂雀彼,看來語文也捉急。
網(wǎng)上說的最多的就是Rxjava的異步性即寡,當然同樣的可以實現(xiàn)異步常規(guī)操作徊哑,大多用AsyncTask / Handler 。既然市面上那么多人推崇Rxjava聪富,那它肯定有存在的必要莺丑。
廢話也不講,慢慢了解它
要學習Rxjava墩蔓,不得不知道這幾個對象:Observable/ Subscriber(可觀察者梢莽,即被觀察者,這兩者區(qū)別,后者增加訂閱和取消訂閱監(jiān)聽)奸披、 Observer (觀察者)蟹漓、 subscribe (訂閱)、事件源内。
這幾個對象的關系其實就和onClick類似,抽象的描述可以比喻:Observable 就像是直播平臺的主播份殿,Observer 則是用戶膜钓,通過用戶訂閱主播這個動作,兩者達成了一個聯(lián)系卿嘲。每次主播開播動作颂斜,就能通知到用戶這邊做對應動作,看直播或者做其他事情拾枣。與onClick比較沃疮,他強大之處,主播的動作也可以自定義梅肤,以及可以控制主播和用戶司蔬,具體在哪個線程中進行。我想這就是Rxjava的強大之一
基本實現(xiàn):
1.創(chuàng)建 Observe
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
2.創(chuàng)建 Observable 另外還有 just/from 等創(chuàng)建方法就不一一闡述
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world");
subscriber.onCompleted();
}
});
3.Subscribe (訂閱)
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
Subscribe內部源碼大致是這樣(copy拋物線大神,源碼實在太雜)
public Subscription subscribe(Subscriber subscriber) {
subscriber.onStart();
onSubscribe.call(subscriber);
return subscriber;
}
Onstart執(zhí)行的類似Subscriber 的生命周期的概念姨蝴,這是一個可選方法俊啼,默認情況下它的實現(xiàn)為空。
.call(Subscriber)在這里左医,事件發(fā)送的邏輯開始運行授帕。從這也可以看出同木,在 RxJava 中, Observable 并不是在創(chuàng)建的時候就立即開始發(fā)送事件跛十,而是在它被訂閱的時候彤路,即當 subscribe() 方法執(zhí)行的時候。
線程控制 —— Scheduler
RxJava 另一個牛逼的地方芥映,就是線程的自由控制洲尊,多次切換線程。
** observeOn()** ** subscribeOn()** 兩個方法屏轰,指定對應的工作在指定的線程進行
示例代碼:
Observable.just(1, 2, 3, 4) // IO 線程颊郎,由 subscribeOn() 指定
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // 新線程,由 observeOn() 指定
.observeOn(Schedulers.io())
.map(mapOperator2) // IO 線程霎苗,由 observeOn() 指定
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber); // Android 主線程姆吭,由 observeOn() 指定
通過 observeOn() 的多次調用,程序實現(xiàn)了線程的多次切換唁盏,不同于 observeOn() 内狸, subscribeOn() 的位置放在哪里都可以,但它是只能調用一次的厘擂,當使用了多個 subscribeOn() 的時候昆淡,只有第一個 subscribeOn() 起作用
doOnSubscribe(): 如果在 doOnSubscribe() 之后有 subscribeOn() 的話,它將執(zhí)行在離它最近的 subscribeOn() 所指定的線程刽严。
操作符
RxJava 之所以強大昂灵,我覺得還因為他集成了各種API操作符,簡直不要太全舞萄。
普通操作符包括:interval眨补、repeat和intervalRange等。
變換操作符:map倒脓、flatMap撑螺、cast和concatMap等;這幾個已經(jīng)靈活用到各個應用場景
過濾操作符包括:filter崎弃、skip甘晤、take、element等等饲做。
組合操作符包括:merge线婚、startWidth、concat盆均、jion酌伊、switch和zip等等。
輔助操作符包括:DO、delay居砖、observeOn虹脯、timeout、timeInterval奏候、timestamp循集、subscribeOn、meterialize和to等蔗草。
錯誤操作符包括:catch和retry咒彤。
條件操作符包括:defaultEmpty、skipUntil咒精、amb镶柱、skipWhile、takeUtil模叙、takeWhile歇拆。
布爾操作符包括:all、isEmpty范咨、contains故觅、exists和sequenceEqual。
轉換操作符包括:toMap渠啊、toMultiMap输吏、toList、toSortedList替蛉、nest和getIterator等