Rxjava操作符講解(1)Creating 創(chuàng)建操作符

在上篇文章Rxjava 從入門到開發(fā)文中我就說過會繼續(xù)寫一個關(guān)于rxjava操作符系列的文章烙如,沒有看過Rxjava 從入門到開發(fā)這篇文章的建議還是看看姓迅,對入門比較有幫助牙寞,如果通過文章學(xué)習(xí)之后痊焊,對rxjava不是很了解的話,那就對著rxjava的操作符一個個學(xué)習(xí)每個操作符的用法芳绩,有熱心人士已經(jīng)把rxjava的wiki翻譯了ReactiveX/RxJava文檔中文版,學(xué)習(xí)里面的內(nèi)容撞反,那么rxjava也就差不多學(xué)會了妥色,但是個人覺得還是不夠通俗易懂(可能自己的理解能力有問題吧??),所以接下來會把常用的操作符結(jié)合翻譯還有自己理解遏片,把使用心得記錄下來嘹害。一句話就是:“加深自己的理解,也希望給大家?guī)韺W(xué)習(xí)思路”吮便,好了廢話不多說笔呀,現(xiàn)在就開始rxjava操作符系列吧。

create操作符

作用:新創(chuàng)建一個Observable

 Observable.create(new Observable.OnSubscribe<Integer>(){

        @Override
        public void call(Subscriber<? super Integer> subscriber) {
            for(int i=0;i<3;i++){
                subscriber.onNext(i);
            }
            subscriber.onCompleted();
        }
    }).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
              Logger.i(String.valueOf(integer));
        }
    });

輸出結(jié)果:

例子說明:在新建的Observable的OnSubscribe中通過傳入的subscriber發(fā)射0到2到Action1髓需。许师。例子比較簡單,繼續(xù)往下走。

Just操作符

作用:將一個或多個對象轉(zhuǎn)換成發(fā)射這個或這些對象的一個Observable

Observable.just("one","two","three").subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Logger.i("just complete..");

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Logger.i("just "+s);
        }
    });

輸出結(jié)果:


例子說明:just后面?zhèn)魅?one","two","three"三個String常量微渠,在Subscriber的onNext方法中就會依次輸出"one","two","three"還有"just complete.."

from操作符

作用:將一個Iterable, 一個Future, 或者一個數(shù)組轉(zhuǎn)換成一個Observable

     Integer[] item={1,2};
    subscription=Observable.from(item).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i( "form " + integer);
        }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            Logger.e( "error: "+throwable.getMessage());
        }
    }, new Action0() {
        @Override
        public void call() {
            Logger.i("from complete");
        }
    });

輸出結(jié)果:

Paste_Image.png

例子說明:from后面?zhèn)魅隝nteger[]數(shù)組 item搭幻,在Action1就會一次輸出“form 1”,“form 2”,Action0會輸出"from complete"。

在這里總結(jié)下just逞盆,from檀蹋,create的區(qū)別:just和from通過代碼追蹤進(jìn)去看到其實(shí)他們還是調(diào)用了create操作符,just傳入的一個或者多個對象纳击,from傳入的是一個Iterable**

interval操作符

作用:創(chuàng)建一個按照給定的時間間隔發(fā)射整數(shù)序列的Observable

Observable.interval(2, TimeUnit.SECONDS).map(new Func1<Long, String>() {
        @Override
        public String call(Long aLong) {
            return String.valueOf(aLong).concat(" :seconds");
        }
    }).observeOn(Schedulers.io()).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Logger.i(s);
        }
    });

輸出結(jié)果:

例子說明:interval操作符會一直輸出0到N的整數(shù)续扔,輸出的頻率由interval傳入的數(shù)字和時間單位決定,例子中設(shè)定為2秒鐘打印一次焕数。

range操作符

作用:創(chuàng)建一個發(fā)射指定范圍的整數(shù)序列的Observable

Observable.range(0,2).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Logger.i(String.valueOf(integer));
        }
    });

輸出結(jié)果:

例子說明:range(x,y) x為最初打印的數(shù)纱昧,y是范圍,例子就是打印出了初始值為1堡赔,然后依次打印2個依次+1的整數(shù)识脆。

timer操作符

作用:創(chuàng)建一個在給定的延時之后發(fā)射單個數(shù)據(jù)的Observable

Observable.timer(2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            Logger.i(String.valueOf(aLong));
        }
    });

輸出結(jié)果:

例子說明:指定延遲的時間,到達(dá)時間值后會輸出一個特殊值“0”善已。

defer操作符

作用:只有當(dāng)訂閱者訂閱才創(chuàng)建Observable灼捂;為每個訂閱創(chuàng)建一個新的Observable

先貼代碼

   final Value value=new Value();
    value.setText("小白");
    Observable<String> observable= Observable.just(value.getText());
    value.setText("小黑");
    subscription=observable.subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Logger.i(s);
        }
    });

例子說明:代碼很簡單,Value是一個類换团,里面只有一個String變量text悉稠,上面代碼編譯之后,大家想想打印出來的結(jié)果是什么艘包?很多人會覺得結(jié)果打印出來的是“小黑”的猛,但是實(shí)際上打印出來的是“小白”,為什么?其實(shí)因?yàn)楫?dāng)使用just或者from操作符的時候想虎,value.gettext就已經(jīng)被調(diào)用卦尊,那么我們?nèi)绾螌?shí)現(xiàn)訂閱的時候才輸出呢?答案就是用defer操作符舌厨,再貼下代碼岂却。。

  final Value value=new Value();
    value.setText("小白");
    Observable<String> observable= Observable.defer(new Func0<Observable<String>>() {
        @Override
        public Observable<String> call() {
            return Observable.just(value.getText());
        }
    });
    value.setText("小黑");

    subscription=observable.subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Logger.i(s);
        }
    });

例子說明:通過使用defer操作符就可以實(shí)現(xiàn)訂閱的時候才執(zhí)行just的代碼裙椭,最后輸出的結(jié)果就是我們想要的“小黑”躏哩。

除了defer操作符之外,我也試過用create操作符也可以實(shí)現(xiàn)上述的功能揉燃,但是create操作符并不是專門用來處理訂閱才創(chuàng)建Observable的功能震庭,所以建議大家還是用defer比較好。

repeat操作符

作用:創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或數(shù)據(jù)序列的Observable

Observable.just("110").repeat(2).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Logger.i(s);
        }
    });

輸出結(jié)果:

例子說明:repeat后面?zhèn)魅胨枰貜?fù)次數(shù)的值你雌,結(jié)果輸出兩次“110”

以上便是創(chuàng)建操作符的主要內(nèi)容了。有啥問題歡迎大家留言交流下??,下篇文章再說說變換操作符歡迎關(guān)注婿崭。

附錄:
文章demo

參考:
ReactiveX/RxJava文檔中文版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拨拓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子氓栈,更是在濱河造成了極大的恐慌渣磷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授瘦,死亡現(xiàn)場離奇詭異醋界,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)提完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門形纺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徒欣,你說我怎么就攤上這事逐样。” “怎么了打肝?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵脂新,是天一觀的道長。 經(jīng)常有香客問我粗梭,道長争便,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任断医,我火速辦了婚禮滞乙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孩锡。我一直安慰自己酷宵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布躬窜。 她就那樣靜靜地躺著浇垦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荣挨。 梳的紋絲不亂的頭發(fā)上男韧,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音默垄,去河邊找鬼此虑。 笑死,一個胖子當(dāng)著我的面吹牛口锭,可吹牛的內(nèi)容都是我干的朦前。 我是一名探鬼主播介杆,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼韭寸!你這毒婦竟也來了春哨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恩伺,失蹤者是張志新(化名)和其女友劉穎赴背,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶渠,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凰荚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了褒脯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片便瑟。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憨颠,靈堂內(nèi)的尸體忽然破棺而出胳徽,到底是詐尸還是另有隱情,我是刑警寧澤爽彤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布养盗,位于F島的核電站,受9級特大地震影響适篙,放射性物質(zhì)發(fā)生泄漏往核。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一嚷节、第九天 我趴在偏房一處隱蔽的房頂上張望聂儒。 院中可真熱鬧,春花似錦硫痰、人聲如沸衩婚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽非春。三九已至,卻和暖如春缓屠,著一層夾襖步出監(jiān)牢的瞬間奇昙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工敌完, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留储耐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓滨溉,卻偏偏與公主長得像什湘,于是被迫代替她去往敵國和親长赞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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