參考學(xué)習(xí)資料 1.0版本
http://gank.io/post/560e15be2dca930e00da1083 扔物線
https://github.com/lzyzsd/Awesome-RxJava 大頭鬼
一蛤迎、基礎(chǔ)
Observables(被觀察者承边,事件源)和Subscribers(觀察者)Observables發(fā)出一系列事件匠题,Subscribers處理這些事件
一個Observable可以發(fā)出零個或者多個事件泰偿,知道結(jié)束或者出錯麻献。每發(fā)出一個事件,就會調(diào)用它的Subscriber的onNext方法徊件,最后調(diào)用Subscriber.onNext()或者Subscriber.onError()結(jié)束梭依。
建議先看大頭鬼的hello world 的例子 (建議碼一遍)
http://blog.csdn.net/lzyzsd/article/details/41833541
Action1<String> onNextAction=new Action1<String>() {
@Override public void call(String s) {
System.out.println(s);
}};
應(yīng)用場景
1.Observable和Subscriber可以做任何事情Observable可以是一個數(shù)據(jù)庫查詢卖擅,Subscriber用來顯示查詢結(jié)果鸣奔;Observable可以是屏幕上的點擊事件,Subscriber用來響應(yīng)點擊事件惩阶;Observable可以是一個網(wǎng)絡(luò)請求挎狸,Subscriber用來顯示請求結(jié)果。
left原理:都是基于一個lift(operator)
* Observable 在執(zhí)行了left之后断楷, 會返回一個新的Observable,這個Observable就像一個代理一樣锨匆,負責(zé)接受原始的Observable發(fā)出的事件。并在處理后發(fā)送給Subscriber冬筒。更像是一種代理機制恐锣,通過事件攔截和處理實現(xiàn)時間序列的變換。
subscribeOn()和 observeOn區(qū)別:
* 1.subscribeOn()線程切換發(fā)生在Onsubscribe中舞痰,即在它通知上一級OnSubscribe時侥蒙,這時事件還沒有開始發(fā)送,因此subscribeOn()的線程控制匀奏,
* 可以從事件發(fā)出的開端就做成了影響。
* 2.observeOn()的線程切換發(fā)送在它內(nèi)建Subscriber中学搜,即發(fā)生在它即將給下一級Subscriber發(fā)送事件時娃善,因此observeOn()控制的是它后面的線程。
*
Observable.doOnSubscribe() 和 Subscriber.onStart() 同樣是在 subscribe() 調(diào)用后而且在事件發(fā)送前執(zhí)行, 但是Observable.doOnSubscribe()可以指定線程瑞佩,默認情況下聚磺, doOnSubscribe() 執(zhí)行在 subscribe() 發(fā)生的線程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的話炬丸,它將執(zhí)行在離它最近的 subscribeOn() 所指定的線程瘫寝。
2.0版本###
導(dǎo)包給我搞吐
包名開頭 最舊 rx-->io 最新
2.0 最核心的是Publisher 和 Subscriber蜒蕾。 Publisher 發(fā)出一系列的時間,Subscriber負責(zé)和處理事件焕阿。
背壓#####
在rxjava中有多重控制流以及背壓(backpressure)策略用來應(yīng)對當(dāng)一個快速發(fā)送消息的被觀察者遇到一個處理消息緩慢的觀察者咪啡。
Flowable的三種Backpressure策略:
BackpressureStrategy.BUFFER####
onBackpressureBuffer是不丟棄數(shù)據(jù)的處理方式。把上游收到的全部緩存下來暮屡,等下游來請求再發(fā)給下游撤摸。相當(dāng)于一個水庫。但上游太快褒纲,水庫(buffer)就會溢出准夷。
BackpressureStrategy.DROP####
BackpressureStrategy.LATEST####
Drop 和Latest 類似,都會丟棄數(shù)據(jù)莺掠,下游通過request請求產(chǎn)生令牌給上游衫嵌,上游接收到多少令牌,就發(fā)送多少彻秆,當(dāng)令牌為0的時候楔绞,上游開始丟棄數(shù)據(jù)。區(qū)別在于掖棉,drop直接丟棄數(shù)據(jù)不緩存數(shù)據(jù)墓律。而latest緩存最新的一條數(shù)據(jù),當(dāng)上游收到令牌幔亥,就把緩存的上一條“最新”數(shù)據(jù)發(fā)送給下游耻讽。
何時用Observable####
當(dāng)上游在一段時間發(fā)送的數(shù)據(jù)量不大(以1000為界限)的時候優(yōu)先選擇使用Observable;
在處理GUI相關(guān)的事件帕棉,比如鼠標(biāo)移動或觸摸事件针肥,這種情況下很少會出現(xiàn)backpressured的問題,用Observable就足以滿足需求香伴;
獲取數(shù)據(jù)操作是同步的慰枕,但你的平臺不支持Java流或者相關(guān)特性。使用Observable的開銷低于Flowable即纲。
何時用Flowable####
當(dāng)上游在一段時間發(fā)送的數(shù)據(jù)量過大的時候(這個量我們往往無法預(yù)計)具帮,此時就要使用Flowable以限制它所產(chǎn)生的量的元素10K +處理。
當(dāng)你從本地磁盤某個文件或者數(shù)據(jù)庫讀取數(shù)據(jù)時(這個數(shù)據(jù)量往往也很大)低斋,應(yīng)當(dāng)使用Flowable蜂厅,這樣下游可以根據(jù)需求自己控制一次讀取多少數(shù)據(jù);
以讀取數(shù)據(jù)為主且有阻塞線程的可能時用Flowable膊畴,下游可以根據(jù)某種條件自己主動讀取數(shù)據(jù)掘猿。
在RxJava2.0中,有五種觀察者模式:####
Observable/Observer
Flowable/Subscriber
Single/SingleObserver
Completable/CompletableObserver
Maybe/MaybeObserver
Observable 寫法:####
Observable-->Observer
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
Flowable寫法###
Flowable-->subscriber
Flowable.range(0, 10)
.subscribe(new Subscriber<Integer>() {
Subscription subscription;
//當(dāng)訂閱后唇跨,會首先調(diào)用這個方法稠通,其實就相當(dāng)于onStart()衬衬,
//傳入的Subscription s參數(shù)可以用于請求數(shù)據(jù)或者取消訂閱
@Override
public void onSubscribe(Subscription s) {
Log.d(TAG, "onsubscribe start");
## 這里需要特別注意。s.request()去請求資源改橘,參數(shù)就是要請求的數(shù)量滋尉,一般如果不限制,寫成Long.MAX_VALUE唧龄。如果不調(diào)用request, onNext()和onComplete方法將不會被調(diào)用兼砖。
subscription = s;
subscription.request(1);
Log.d(TAG, "onsubscribe end");
}
@Override
public void onNext(Integer o) {
## onNext 方法里面?zhèn)魅氲膮?shù)就是Flowable 中發(fā)射出來的。
Log.d(TAG, "onNext--->" + o);
subscription.request(3);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
如果只關(guān)注onNext()既棺,可以
Consumer consumer=new Consumer<String>(){
@Override
public void accept(String s) throws Exception{
System.out.println(s);
}
}
Actions
為了減少組件數(shù)量讽挟,2.x中沒有定義Action3-Action9和ActionN。
保留的action接口按照Java 8 functional風(fēng)格命名丸冕。 無參數(shù)的Action0 被操作符io.reactivex.functions.Action和Scheduler代替耽梅。
Action1被重命名為Consumer。Action2 被重命名為BiConsumer胖烛。 ActionN 被Consumer<Object[]> 代替眼姐。##
Functions
我們按照Java 8的命名風(fēng)格定義了io.reactivex.functions.Function 和io.reactivex.functions.BiFunction, 把Func3 - Func9 分別改成了 Function3 - Function9 。FuncN被Function<Object[], R>代替佩番。
此外众旗,操作符不再使用Func1<T, Boolean>但原始返回類型為Predicate<T>。
io.reactivex.functions.Functions類提供了常見的轉(zhuǎn)換功能Function<Object[], R>