RxJava小貼士-創(chuàng)建Observable

在使用RxJava的第一步就是創(chuàng)建一個(gè)你所需要的Observable转唉,根據(jù)不同的需求創(chuàng)建不同的Observable。

首先你得了解Observable的分類

Observable分類

  • Cold Observable

    當(dāng)沒有訂閱的時(shí)候,該Observable不處理任何事件火的,當(dāng)有訂閱者發(fā)起訂閱后壶愤,才開始響應(yīng),從第一個(gè)數(shù)據(jù)開始發(fā)射馏鹤。

  • Hot Observable

    不管有沒有訂閱者公你,該Observable一直在發(fā)射數(shù)據(jù)。

關(guān)于‘冷’假瞬、‘熱’我是這樣理解的:‘冷’的Observable是默認(rèn)定義了數(shù)據(jù)或者獲取數(shù)據(jù)的方式,每次訂閱后將所有的數(shù)據(jù)迂尝,按照一定的規(guī)則發(fā)射給你脱茉;‘熱’則是動(dòng)態(tài)的數(shù)據(jù),而這個(gè)被觀察者一直處于發(fā)射狀態(tài)垄开,當(dāng)你訂閱后琴许,其實(shí)就是從現(xiàn)在開始接收到數(shù)據(jù)而已,這里的數(shù)據(jù)都是動(dòng)態(tài)的溉躲、實(shí)時(shí)變化的榜田,而不是定義Observable就把數(shù)據(jù)默認(rèn)好了。

如何選擇合適的Observable

  • 已經(jīng)獲取到的數(shù)據(jù)進(jìn)行處理 -Cold

    比較典型的例子锻梳,篩選一個(gè)數(shù)組中所有的偶數(shù)

    Integer[] array = new Integer[]{1,2,3,4,5,6,7,8};
            Observable.fromArray(array)
                    .filter(item -> item%2 == 0)
                    .subscribe(item -> System.out.println("item#"+item));
    

    如果你單獨(dú)創(chuàng)建一個(gè)Observable.fromArray(array)這個(gè)被觀察者是沒有處理任何事件

    ?

  • 觸發(fā)一個(gè)固定事件獲取數(shù)據(jù)-Cold

    這種一般用于異步獲取數(shù)據(jù)箭券,比如網(wǎng)絡(luò)請(qǐng)求:

        //模擬一個(gè)耗時(shí)3秒的請(qǐng)求
        String getData(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "test";
        }
    
        Observable.create((ObservableOnSubscribe<String>) e -> {
                try {
                    System.out.println("start#"+System.currentTimeMillis());
                    String data = getData();
                    e.onNext(data);
                          //一般這種獲取數(shù)據(jù)方式的被觀察者,獲取到一個(gè)數(shù)據(jù)后就調(diào)用onComplete
                    e.onComplete();
                }catch (Exception e1){
                    e.onError(e1);
                }
            }).observeOn(Schedulers.newThread())
              .subscribe(data->{
                System.out.println("data#"+data);
                System.out.println("end#"+System.currentTimeMillis());
              });
    

    結(jié)果

    start#1493776191045
    data#test
    end#1493776194051
    

    這種方式創(chuàng)建的Observable也是的疑枯,可以在Demo去掉subscribe訂閱辩块,就會(huì)發(fā)現(xiàn)實(shí)際這個(gè)Observable什么事情都沒做。

  • 創(chuàng)建一個(gè)當(dāng)前狀態(tài)的Observable-Hot

    這種Observable實(shí)際運(yùn)用中非常有用荆永、方便废亭、簡(jiǎn)潔。比如對(duì)Activity的生命周期具钥,可以做一個(gè)Observable豆村,當(dāng)生命周期改變時(shí),對(duì)其發(fā)射數(shù)據(jù)骂删。對(duì)TextView的text變化創(chuàng)建一個(gè)Observable掌动,每當(dāng)text變化的時(shí)候發(fā)射給訂閱者,等等桃漾。

    這里已TextView text變化為例:

    這里使用BehaviorSubject而不使用PublishSubject是因?yàn)榛捣耍趯?shí)際使用中我們需要從訂閱開始那一刻就知道目前TextView的text是什么,使用BehaviorSubject會(huì)在訂閱那一刻將最后一次發(fā)射的數(shù)據(jù)發(fā)射給訂閱者撬统,而PublishSubject則是訂閱開始后适滓,直到下次有text變化,那訂閱者才能接收到第一個(gè)數(shù)據(jù)恋追。

    創(chuàng)建一個(gè)工具類TextViews.java

    public static Observable<CharSequence> textChange(final TextView textView){
              //創(chuàng)建Observable凭迹,并對(duì)其設(shè)置默認(rèn)值
            BehaviorSubject<CharSequence> observable = BehaviorSubject.createDefault(textView.getText());
            TextWatcher textWatcher = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {}
              
                @Override
                public void afterTextChanged(Editable s) {
                    observable.onNext(s);
                    Log.d("RxJava","onChange");
                }
            };
            textView.addTextChangedListener(textWatcher);
              //doOnDispose 當(dāng)取消訂閱時(shí)候響應(yīng)罚屋,同時(shí)取消監(jiān)聽
             return observable.doOnDispose(()->{
                textView.removeTextChangedListener(textWatcher);
                observable.onComplete();
            });
        }
    

    使用

    EditText editText = (EditText) findViewById(R.id.edit);
    
    final Disposable disposable = TextViews.textChange(editText)
      .subscribe(text-> Log.d("RxJava","text#"+text));
    //點(diǎn)擊按鈕取消監(jiān)聽
    findViewById(R.id.cancel).setOnClickListener(v ->{
      if(!disposable.isDisposed()){
        disposable.dispose();
      }
    });
    

    在后續(xù)實(shí)際開發(fā)中基本只需要關(guān)心怎么使用textChange所返回的數(shù)據(jù),而其變?yōu)镺bservable之后操作很多事件就變得很方便

    比如將其變?yōu)楸O(jiān)聽text長(zhǎng)度

    TextViews.textChange(editText)
      .map(CharSequence::length)
      .subscribe(len-> Log.d("RxJava","text#"+len));
    

    對(duì)于一個(gè)button嗅绸,當(dāng)Edittext的text長(zhǎng)度大于4才能點(diǎn)擊

    TextViews.textChange(editText)
      .map(CharSequence::length)
      .map(len->len>4)
      .subscribe(button::setEnabled);
    

總結(jié)
關(guān)于創(chuàng)建Observable的方式還有很多脾猛,這里簡(jiǎn)單說了我自己最常用的部分。希望大家能給大家?guī)硪欢ǖ膸椭沭H绻绣e(cuò)誤的地方指出來猛拴,大家都共同學(xué)習(xí)下。
?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚀狰,一起剝皮案震驚了整個(gè)濱河市愉昆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌麻蹋,老刑警劉巖跛溉,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扮授,居然都是意外死亡芳室,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門刹勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堪侯,“玉大人,你說我怎么就攤上這事荔仁《陡瘢” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咕晋,是天一觀的道長(zhǎng)雹拄。 經(jīng)常有香客問我,道長(zhǎng)掌呜,這世上最難降的妖魔是什么滓玖? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮质蕉,結(jié)果婚禮上势篡,老公的妹妹穿的比我還像新娘。我一直安慰自己模暗,他們只是感情好禁悠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兑宇,像睡著了一般碍侦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天瓷产,我揣著相機(jī)與錄音站玄,去河邊找鬼。 笑死濒旦,一個(gè)胖子當(dāng)著我的面吹牛株旷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尔邓,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼晾剖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了梯嗽?” 一聲冷哼從身側(cè)響起钞瀑,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慷荔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缠俺,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡显晶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹士。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷雇。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躏救,靈堂內(nèi)的尸體忽然破棺而出唯笙,到底是詐尸還是另有隱情,我是刑警寧澤盒使,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布崩掘,位于F島的核電站,受9級(jí)特大地震影響少办,放射性物質(zhì)發(fā)生泄漏苞慢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一英妓、第九天 我趴在偏房一處隱蔽的房頂上張望挽放。 院中可真熱鬧,春花似錦蔓纠、人聲如沸辑畦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯出。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潦刃,已是汗流浹背侮措。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖杠,地道東北人分扎。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胧洒,于是被迫代替她去往敵國和親畏吓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 注:只包含標(biāo)準(zhǔn)包中的操作符卫漫,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,186評(píng)論 2 8
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符菲饼。對(duì)于擴(kuò)展包,由于使用率較低列赎,如有需求宏悦,請(qǐng)讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,632評(píng)論 8 93
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位包吝,與響應(yīng)式編程作為結(jié)合使用的饼煞,對(duì)什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,851評(píng)論 0 10
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,814評(píng)論 0 1
  • 原文地址 RxAndroid Tutorial響應(yīng)式編程(Reactive programming)不是一種API...
    sheepm閱讀 59,145評(píng)論 23 170