我用RxJava 的主要原因是它對我們數(shù)據(jù)流向的一種抽象,用好了,能梳理好代碼結(jié)構(gòu),不致于讓代碼寫到哪里就是哪里,這種寫到哪里就是哪里的代碼,真的對別人對自己都很不負責,對別人來說,維護起來想罵人,對于自己來說,其實是給自己挖坑。
很多時候,我發(fā)現(xiàn)大部分人用RxJava,看一下網(wǎng)上的demo怎么使用的,然后就模仿著用,結(jié)果用著用著就變形了,怎么變形的?因為模仿只能學會一招,接下來發(fā)生需求變化的時候,就用這一招來套,結(jié)果就出現(xiàn)了很多搞笑的使用場景。
比如,網(wǎng)上介紹的RxJava,大致就是這樣的,然后有人模仿用的時候,就記住了這個模式,然后心里面大致知道上面大括號內(nèi)是運行在子線程,然后下面大括號內(nèi),就是主線程。這個時候如果onNext執(zhí)行完成了,還需要去請求服務器,或者是其他耗時操作,然后有人就來了,靈機一動,我再創(chuàng)建一個Observable.create不就行了,于是在onNext下面又嵌套一層Observable.create,此時,代碼應該已經(jīng)很長了,差不多就是這樣:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
//請求服務器獲取數(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>() {
//再次去請求服務器
...
}
}
...
});
這就是還不太了解RxJava是怎么控制數(shù)據(jù)流的,RxJava做成鏈式調(diào)用的方式,很多時候是為了讓每一個步驟都清晰,例如:
source //數(shù)據(jù)源
.operator1() //操作1,先請求服務器接口
.operator2() //操作2,獲取本地數(shù)據(jù)庫信息
.operator3() //操作3,比較本地數(shù)據(jù)庫內(nèi)容并且更新數(shù)據(jù)庫
.operatorN() //操作N,可能還有很多操作。。。
.subscribe(consumer) // 開始去消費我最終的數(shù)據(jù),比如:拿到列表數(shù)據(jù),我顯示出來列表
按照這樣的方式去維護我們的一個數(shù)據(jù)流程,就能夠很好的整理我們的代碼流程,一個整體的流程,就知道這整個流是做什么的。
RxJava的整個設計,都是圍繞對流做處理,你不需要去關心線程啟動關閉,因為人家有任務調(diào)度器,就是專門干這個事情的,你只需要
添加指定的任務調(diào)度器類型放到subscribeOn中就行了。
當深刻的認識到RxJava的宗旨就是對流做處理,同時又能夠保證復雜業(yè)務也能梳理的很好的時候,這就很足夠了,同時這個將能夠幫助你更好的理解源嗎的設計。
既然始終是圍繞著數(shù)據(jù)流來設計的框架,那肯定需要考慮到各種各樣的流:
合并流(比如你要顯示一個內(nèi)容的時候,需要多種服務器的數(shù)據(jù),那么就存在多種數(shù)據(jù)源,數(shù)據(jù)源就需要合并,也就有了合并流)
轉(zhuǎn)換流(比如你獲取過來的數(shù)據(jù)需要轉(zhuǎn)換一下數(shù)據(jù)類型)
一堆對流進行處理的操作符,所以你能看到RxJava中有很多很多的操作符,這些東西本質(zhì)上就是為了方便你去更好的處理流,剛開始學習RxJava的時候,千萬不要給操作符給淹沒了,因為他只是一個幫助你提升效率的工具,有它沒它,你也可以用好RxJava寫出好的數(shù)據(jù)流向代碼,讓代碼清晰可維護。
RxJava只有你能深刻的理解它是對數(shù)據(jù)流的控制,保證代碼清晰的一種工具,你才能用好它,否者你會發(fā)現(xiàn)濫用RxJava將會影響代碼閱讀帶來的反向的效果。
祝君寫出更好的代碼。