說說RxJava在項(xiàng)目怎么登的基

問題1:查看商品诲锹,先是獲取商品數(shù)據(jù),然后獲取評(píng)論惑折,然后授账。。惨驶。

解決手段:concat
詳解:

  1. concat:接收若干個(gè)Observables白热,將其組合并有序發(fā)射

代碼

private void pay() {
        Observable.concat(getGoods(), getComment()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull Object o) {
                        System.out.println(o.toString());
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        e.printStackTrace();
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    private Observable<Object> getGoods() {
        return Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
                // 獲取商品數(shù)據(jù)
                System.out.println("獲取商品數(shù)據(jù)中");
                Thread.sleep(3000);
                e.onNext("我是商品數(shù)據(jù)");
                // 注意,必須調(diào)用onComlete粗卜,否則下一個(gè)Observable不會(huì)執(zhí)行
                e.onComplete();
            }
        });
    }

    private Observable<Object> getComment() {
        return Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
                // 獲取商品評(píng)論
                System.out.println("獲取商品評(píng)論中");
                Thread.sleep(3000);
                e.onNext("我是商品評(píng)論");
                e.onComplete();
            }
        });
    }

結(jié)果展示


結(jié)果展示
問題1.1:登錄屋确,獲取userID,然后根據(jù)ID去請(qǐng)求。攻臀。焕数。

解決手段:flatmap
詳解:

private void flatmap() {
        login().flatMap(new Function<User, ObservableSource<Boolean>>() {
            @Override
            public ObservableSource<Boolean> apply(@NonNull User user) throws Exception {
                System.out.println("用戶id" + user.uID);
                return comment(user.uID);
            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Boolean o) {
                System.out.println("評(píng)論" + o);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
問題1.2:頁面數(shù)據(jù)需要請(qǐng)求幾個(gè)接口才能得到最終信息。刨啸。百匆。

解決手段:zip
詳解:

private void zip() {
        Observable.zip(getComment(), getFromNet(), new BiFunction<Object, Integer, Object>() {
            @Override
            public Object apply(@NonNull Object o, @NonNull Integer integer) throws Exception {
                System.out.println("中間合并分別是" + o.toString() + "和" + integer);
                return o.toString() + integer;
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {
                System.out.println("結(jié)果" + o);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
結(jié)論:concat和merge都是兩個(gè)Observable組合,每發(fā)射一次就會(huì)回調(diào)一次呜投,zip就是兩個(gè)Observable組合等兩個(gè)Observable都發(fā)射了才會(huì)回調(diào)

問題2:展示一份數(shù)據(jù)加匈,數(shù)據(jù)來源有本地緩存以及網(wǎng)絡(luò)獲取,首先查看是否有緩存仑荐,沒有則使用網(wǎng)絡(luò)

解決手段:concat雕拼、first
詳解:first:只取第一個(gè)發(fā)射的數(shù)據(jù)
代碼

private void getData() {
        Observable.concat(getFromCache(),getFromNet()).first(1).subscribeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                
            }

            @Override
            public void onSuccess(@NonNull Integer integer) {
                
            }

            @Override
            public void onError(@NonNull Throwable e) {
                
            }
        });
    }

    private Observable<Integer> getFromCache() {
        return Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                if (hasCache) {
                    e.onNext(0);
                }
                e.onComplete();
            }
        });
    }

    private Observable<Integer> getFromNet() {
        return Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                if (!hasCache) {
                    Thread.sleep(3000);
                    e.onNext(1);
                }
                e.onComplete();
            }
        });
    }

問題3:注冊(cè)頁面,需要所有信息填寫完整粘招,才能點(diǎn)擊注冊(cè)

解決手段:combineLatest
詳解:combineLatest()作用于最近發(fā)射的數(shù)據(jù)項(xiàng):如果Observable1發(fā)射了A并且Observable2發(fā)射了B和C啥寇,combineLatest()將會(huì)分組處理AB和AC

combineLatest

代碼

Observable<CharSequence> observableName = RxTextView.textChanges(((TextView) findViewById(R.id.text)));
        Observable<CharSequence> observablePwd = RxTextView.textChanges(((TextView) findViewById(R.id.text)));
        Observable<Boolean> observableEnd = Observable.combineLatest(observableName, observablePwd, new BiFunction<CharSequence,CharSequence,Boolean>() {

            @Override
            public Boolean apply(@NonNull CharSequence charSequence, @NonNull CharSequence charSequence2) throws Exception {
                return charSequence.length() > 0 && charSequence2.length() > 0;
            }
        });

問題4:數(shù)據(jù)源需要進(jìn)行篩選或者除null等過濾操作,不需要在結(jié)果再進(jìn)行篩選洒扎,更專注與業(yè)務(wù)

解決手段:filter
代碼

private void filter() {
        Observable.fromArray("123","145",null,"3456").filter(new Predicate<String>() {
            @Override
            public boolean test(@NonNull String s) throws Exception {
                // 這里會(huì)過濾掉null值已經(jīng)不是1開頭的字符串
                return !TextUtils.isEmpty(s) && s.startsWith("1");
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                System.out.println(s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辑甜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子袍冷,更是在濱河造成了極大的恐慌磷醋,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡诗,死亡現(xiàn)場(chǎng)離奇詭異邓线,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煌恢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門骇陈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑰抵,你說我怎么就攤上這事你雌。” “怎么了二汛?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵婿崭,是天一觀的道長。 經(jīng)常有香客問我习贫,道長逛球,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任苫昌,我火速辦了婚禮颤绕,結(jié)果婚禮上幸海,老公的妹妹穿的比我還像新娘。我一直安慰自己奥务,他們只是感情好物独,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氯葬,像睡著了一般挡篓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帚称,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天官研,我揣著相機(jī)與錄音,去河邊找鬼闯睹。 笑死戏羽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的楼吃。 我是一名探鬼主播始花,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼孩锡!你這毒婦竟也來了酷宵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤躬窜,失蹤者是張志新(化名)和其女友劉穎浇垦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩披,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溜族,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垦沉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仍劈,死狀恐怖厕倍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贩疙,我是刑警寧澤讹弯,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站这溅,受9級(jí)特大地震影響组民,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悲靴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一臭胜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦耸三、人聲如沸乱陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憨颠。三九已至,卻和暖如春积锅,著一層夾襖步出監(jiān)牢的瞬間爽彤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工缚陷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淫茵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓蹬跃,卻偏偏與公主長得像匙瘪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝶缀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位丹喻,與響應(yīng)式編程作為結(jié)合使用的,對(duì)什么是操作翁都、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,860評(píng)論 0 10
  • 響應(yīng)式編程簡介 響應(yīng)式編程是一種基于異步數(shù)據(jù)流概念的編程模式碍论。數(shù)據(jù)流就像一條河:它可以被觀測(cè),被過濾柄慰,被操作鳍悠,或者...
    說碼解字閱讀 3,066評(píng)論 0 5
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,193評(píng)論 2 8
  • 參考:給 Android 開發(fā)者的 RxJava 詳解-扔物線深入淺出RxJava 基礎(chǔ) "a library f...
    Vincen1024閱讀 542評(píng)論 0 1
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符坐搔。對(duì)于擴(kuò)展包藏研,由于使用率較低,如有需求概行,請(qǐng)讀者自行查閱文檔蠢挡。 創(chuàng)...
    maplejaw_閱讀 45,661評(píng)論 8 93