我用RxJava 的主要原因是它對(duì)我們數(shù)據(jù)流向的一種抽象,用好了,能梳理好代碼結(jié)構(gòu)官帘,不致于讓代碼寫到哪里就是哪里,這種寫到哪里就是哪里的代碼昧谊,真的對(duì)別人對(duì)自己都很不負(fù)責(zé)刽虹,對(duì)別人來說,維護(hù)起來想罵人呢诬,對(duì)于自己來說涌哲,其實(shí)是給自己挖坑。
很多時(shí)候尚镰,我發(fā)現(xiàn)大部分人用RxJava阀圾,看一下網(wǎng)上的demo怎么使用的,然后就模仿著用狗唉,結(jié)果用著用著就變形了初烘,怎么變形的?因?yàn)槟7轮荒軐W(xué)會(huì)一招分俯,接下來發(fā)生需求變化的時(shí)候肾筐,就用這一招來套,結(jié)果就出現(xiàn)了很多搞笑的使用場景澳迫。
比如局齿,網(wǎng)上介紹的RxJava,大致就是這樣的橄登,然后有人模仿用的時(shí)候抓歼,就記住了這個(gè)模式,然后心里面大致知道上面大括號(hào)內(nèi)是運(yùn)行在子線程拢锹,然后下面大括號(hào)內(nèi)谣妻,就是主線程。這個(gè)時(shí)候如果onNext執(zhí)行完成了卒稳,還需要去請(qǐng)求服務(wù)器蹋半,或者是其他耗時(shí)操作,然后有人就來了充坑,靈機(jī)一動(dòng)减江,我再創(chuàng)建一個(gè)Observable.create不就行了染突,于是在onNext下面又嵌套一層Observable.create,此時(shí)辈灼,代碼應(yīng)該已經(jīng)很長了份企,差不多就是這樣:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
//請(qǐng)求服務(wù)器獲取數(shù)據(jù)
emitter.onNext("數(shù)據(jù)1");
emitter.onComplete();
}
})
.observeOn(AndroidSchedulers.mainThread())//回調(diào)在主線程
.subscribeOn(Schedulers.io())//執(zhí)行在io線程
.subscribe(new Observer<String>() {
...
@Override
public void onNext(String value) {
Log.e(TAG,"onNext:"+value);
Observable.create(new ObservableOnSubscribe<String>() {
//再次去請(qǐng)求服務(wù)器
...
}
}
...
});
這就是還不太了解RxJava是怎么控制數(shù)據(jù)流的,RxJava做成鏈?zhǔn)秸{(diào)用的方式巡莹,很多時(shí)候是為了讓每一個(gè)步驟都清晰司志,例如:
source //數(shù)據(jù)源
.operator1() //操作1,先請(qǐng)求服務(wù)器接口
.operator2() //操作2降宅,獲取本地?cái)?shù)據(jù)庫信息
.operator3() //操作3骂远,比較本地?cái)?shù)據(jù)庫內(nèi)容并且更新數(shù)據(jù)庫
.operatorN() //操作N,可能還有很多操作腰根。激才。。
.subscribe(consumer) // 開始去消費(fèi)我最終的數(shù)據(jù)唠雕,比如:拿到列表數(shù)據(jù)贸营,我顯示出來列表
按照這樣的方式去維護(hù)我們的一個(gè)數(shù)據(jù)流程,就能夠很好的整理我們的代碼流程岩睁,一個(gè)整體的流程钞脂,就知道這整個(gè)流是做什么的。
RxJava的整個(gè)設(shè)計(jì)捕儒,都是圍繞對(duì)流做處理冰啃,你不需要去關(guān)心線程啟動(dòng)關(guān)閉,因?yàn)槿思矣腥蝿?wù)調(diào)度器刘莹,就是專門干這個(gè)事情的阎毅,你只需要
添加指定的任務(wù)調(diào)度器類型放到subscribeOn中就行了。
當(dāng)深刻的認(rèn)識(shí)到RxJava的宗旨就是對(duì)流做處理点弯,同時(shí)又能夠保證復(fù)雜業(yè)務(wù)也能梳理的很好的時(shí)候扇调,這就很足夠了,同時(shí)這個(gè)將能夠幫助你更好的理解源嗎的設(shè)計(jì)抢肛。
既然始終是圍繞著數(shù)據(jù)流來設(shè)計(jì)的框架狼钮,那肯定需要考慮到各種各樣的流:
合并流(比如你要顯示一個(gè)內(nèi)容的時(shí)候,需要多種服務(wù)器的數(shù)據(jù)捡絮,那么就存在多種數(shù)據(jù)源熬芜,數(shù)據(jù)源就需要合并,也就有了合并流)
轉(zhuǎn)換流(比如你獲取過來的數(shù)據(jù)需要轉(zhuǎn)換一下數(shù)據(jù)類型)
一堆對(duì)流進(jìn)行處理的操作符福稳,所以你能看到RxJava中有很多很多的操作符涎拉,這些東西本質(zhì)上就是為了方便你去更好的處理流,剛開始學(xué)習(xí)RxJava的時(shí)候,千萬不要給操作符給淹沒了鼓拧,因?yàn)樗皇且粋€(gè)幫助你提升效率的工具半火,有它沒它,你也可以用好RxJava寫出好的數(shù)據(jù)流向代碼季俩,讓代碼清晰可維護(hù)慈缔。
RxJava只有你能深刻的理解它是對(duì)數(shù)據(jù)流的控制,保證代碼清晰的一種工具种玛,你才能用好它,否者你會(huì)發(fā)現(xiàn)濫用RxJava將會(huì)影響代碼閱讀帶來的反向的效果瓤檐。
祝君寫出更好的代碼赂韵。