認(rèn)識(shí) rxjava
RxJava是 ReactiveX 在JVM上的一個(gè)實(shí)現(xiàn)片仿,ReactiveX使用Observable序列組合異步和基于事件的程序。
Observable(觀察者) 和 Subscriber(訂閱者)是兩個(gè)主要的類尤辱。在 RxJava 上砂豌,一個(gè) Observable 是一個(gè)發(fā)出數(shù)據(jù)流或者事件的類,Subscriber 是一個(gè)對(duì)這些發(fā)出的 items (數(shù)據(jù)流或者事件)進(jìn)行處理(采取行動(dòng))的類光督。一個(gè) Observable 的標(biāo)準(zhǔn)流發(fā)出一個(gè)或多個(gè) item阳距,然后成功完成或者出錯(cuò)。一個(gè) Observable 可以有多個(gè) Subscribers结借,并且通過(guò) Observable 發(fā)出的每一個(gè) item筐摘,該 item 將會(huì)被發(fā)送到 Subscriber.onNext() 方法來(lái)進(jìn)行處理。一旦 Observable 不再發(fā)出 items船老,它將會(huì)調(diào)用 Subscriber.onCompleted() 方法咖熟,或如果有一個(gè)出錯(cuò)的話 Observable 會(huì)調(diào)用 Subscriber.onError() 方法。
rxjava最近之所以這么熱門的原因柳畔,歸根結(jié)底是因?yàn)樗男蛄行蕴幚礅晒埽@種強(qiáng)大來(lái)源于它的操作符。在這里薪韩,我不再贅述咽斧,網(wǎng)上很多介紹Operator的文章堪置,可以看RxJava中文文檔,或者RxJava實(shí)戰(zhàn)张惹。相信,當(dāng)你了解過(guò)后岭洲,對(duì)Rxjava就會(huì)有一定思路了宛逗。
RxJava 入門
建議看下上面的兩篇關(guān)于rxjava介紹的文章,這樣盾剩,你讀下去才不會(huì)一頭霧水雷激,大神除外。
接觸rxjava,是因?yàn)楣卷?xiàng)目組的一個(gè)同事用rxjava對(duì)登錄操作做了回調(diào)以及返回原入口界面告私,基于這樣的需求屎暇,rxjava進(jìn)入了世界。驻粟。
這邊根悼,還要講到rxjava對(duì)處理所在的線程的調(diào)控。這也是rxjava的又一個(gè)原因蜀撑〖费玻——RxJava 的 Schedulers(調(diào)度器) 功能。
對(duì)于任何 Observable 你可以定義在兩個(gè)不同的線程酷麦,Observable 會(huì)操作在它上面矿卑。使用 Observable.observeOn() 可以定義在一個(gè)線程上,可以用來(lái)監(jiān)聽(tīng)和檢查從 Observable 最新發(fā)出的 items (Subscriber 的 onNext沃饶,onCompleted 和 onError 方法會(huì)執(zhí)行在 observeOn 所指定的線程上)母廷,并使用 Observable.subscribeOn() 來(lái)定義一個(gè)線程,將其運(yùn)行我們 Observable 的代碼(長(zhǎng)時(shí)間運(yùn)行的操作)糊肤。
RxJava 默認(rèn)情況下是單線程的琴昆,你會(huì)需要利用 observeOn() 和 subscribeOn() 方法為你的應(yīng)用帶來(lái)多線程操作。RxJava 附帶了幾個(gè)現(xiàn)成的 Schedulers 給 Observables 使用轩褐,如:Schedulers.io() (用于 I/O 操作)椎咧,Schedulers.computation()(計(jì)算工作),和 Schedulers.newThread()(為任務(wù)創(chuàng)建的新線程)把介。
這邊勤讽,要特別注意一點(diǎn),當(dāng)你在activity界面里實(shí)現(xiàn)了訂閱(Subscription =Observable.subscribe() )后拗踢,一定要在界面摧毀時(shí)實(shí)現(xiàn)反訂閱(Subscription.unsubscribe() )脚牍,防止內(nèi)存泄漏!
使用
在沒(méi)用rxjava之前巢墅,為了通知消息诸狭,從這個(gè)頁(yè)面通知上個(gè)頁(yè)面數(shù)據(jù)顯示做改變券膀,或者這個(gè)頁(yè)面數(shù)據(jù)改變,通知相關(guān)的多個(gè)頁(yè)面做改變驯遇,我們會(huì)想到回調(diào)芹彬,或者廣播。然而這樣寫是惡心的叉庐,具體怎么惡心舒帮,你自己寫寫估計(jì)就知道了。現(xiàn)在有了rxjava,發(fā)現(xiàn)實(shí)現(xiàn)上簡(jiǎn)單多了陡叠,還有擴(kuò)展性玩郊,嗯,來(lái)操作一番枉阵!
首先译红,Android Studio建立一個(gè)測(cè)試工程TestApp, 在build.gradle構(gòu)建中實(shí)現(xiàn)需要的rxjava依賴信息
這樣我們就可以在類文件里引用需要的rxjava method.
其次,建立一個(gè)rx刷新事件(RxRefreshEvent),具體實(shí)現(xiàn)如下:
getObservable(): 主要是為了外面的類可以得到這個(gè)觀察者兴溜,實(shí)現(xiàn)操作監(jiān)聽(tīng)侦厚。
Publish(T t): 用于觀察者基于需求發(fā)布相關(guān)的消息,以便Subsribers實(shí)現(xiàn)操作昵慌。
接著假夺,同時(shí)建立一個(gè)觀察者發(fā)布消息界面,以及一個(gè)訂閱者接受顯示界面:
這樣斋攀,一個(gè)簡(jiǎn)單的demo就完成了已卷。當(dāng)觀察者需要將改變后的數(shù)據(jù)通過(guò)publish()發(fā)送出去,訂閱者由于訂閱關(guān)系淳蔼,在Action-call()方法中回調(diào)侧蘸。嗯,完成了數(shù)據(jù)的改變鹉梨!這個(gè)發(fā)布消息的過(guò)程讳癌,其實(shí)是一對(duì)多的,也就是多個(gè)訂閱者都可以收到同一個(gè)觀察者發(fā)來(lái)的消息存皂。就幾句代碼晌坤,簡(jiǎn)單實(shí)用!
**如果覺(jué)得此文不錯(cuò)旦袋,麻煩幫我點(diǎn)下“喜歡”骤菠。么么噠!**