Rxjava是基于jvm的可觀測序列的處理異步事件的程序庫。其基本理念是被觀察者(observable)發(fā)送數(shù)據(jù),這些數(shù)據(jù)通過被觀察者調(diào)用操作符處理,然后這些被處理過的數(shù)據(jù)發(fā)送給訂閱了的觀察者(Observer)。共有五種基本類型(observable)可以使用操作符:
- Flowable 能發(fā)送0到n個項目,支持響應流和背壓
- Observable 能發(fā)送0到n個項目,不支持背壓
- Single 僅支持返回一個項目或者一個錯誤
- Completable 沒有返回,僅僅只有完成或者錯誤,相當于void
- Maybe 能夠發(fā)射0或者1個數(shù)據(jù),要么成功,要么失敗。
由于subject繼承了被觀察者(observable),實現(xiàn)了觀察者(observer)接口,因此subject既可以被認為是觀察者,也可以被認為是被觀察者。因此通過subject訂閱被觀察者,就可以實現(xiàn)cold observable到hot observable的轉換。
背壓就是生產(chǎn)的數(shù)據(jù)太快了,而消費者處理不了那么快。那么就讓生產(chǎn)者低速生產(chǎn)的方式。也可以通過其他方案解決搜索框延遲搜索的問題,sample,throttle 都有類似debounce的這個功能。如果想要收集中間的變化結果,可以使用buffer或者window。
interval不支持背壓,而range支持背壓,支持背壓則可以通過request()操作符進行限制。是否支持背壓涉及到Cold Observables和Hot Observables,前者表示在訂閱之后才開始發(fā)送事件的Observable。后者表示不管是否訂閱,創(chuàng)建就會發(fā)送事件的。cold Observables 中也有不支持背壓的(interval ,timer),hot Observables則都不支持背壓。
subject的子類有下面幾種,他們也都同時具有觀察者和被觀察者的身份:
- publishSubject只會把在訂閱發(fā)生的時間點之后來自原始Observable的數(shù)據(jù)發(fā)射給觀察者。
- ReplaySubject會發(fā)射所有來自原始Observable的數(shù)據(jù)給觀察者,無論它們是何時訂閱的。
- BehaviorSubject 當被訂閱時,它開始發(fā)射原始Observable最近發(fā)射的數(shù)據(jù)(如果此時還沒有收到任何數(shù)據(jù),它會發(fā)射一個默認值),然后繼續(xù)發(fā)射其它任何來自原始Observable的數(shù)據(jù)。
- AsyncSubject只在原始Observable完成后,發(fā)射來自原始Observable的最后一個值。
- SerializedSubject 同時保證只有一個線程操作,但不保證所有操作都是同一個線程。
Rxjava是觀察者模式和迭代器模式相結合的函數(shù)式編程的精華。
迭代器模式是消費者從生產(chǎn)者那里pull拉取數(shù)據(jù),線程阻塞直到數(shù)據(jù)準備好。observable則是在數(shù)據(jù)準備好后,生產(chǎn)者將數(shù)據(jù)推送給消費者。這里的迭代器模式理解為生產(chǎn)消費模式更好。生產(chǎn)消費模式中間采用了阻塞隊列來緩沖。
明白了觀察者和被觀察者之間的關系之后,就是如何應用操作符了。操作符講解,可以查看文檔。