用RxJava你必須要深刻知道的一件事情

我用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將會影響代碼閱讀帶來的反向的效果。

祝君寫出更好的代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容