RxJava 基礎操作符的使用入門(創(chuàng)建操作)

從2015年10月份知道RxJava并使用過一次之后雨涛,因為工作忙的原因一直沒有再去接觸過這個讓人無法抗拒的編程接口碧浊。經過幾天的學習之后把學習的東西總結一下,畢竟才接觸隘击,若有不對的地方侍芝,請留言指正研铆。

我的學習資料

1、Reactive ——強烈推薦州叠,Rx官網

2棵红、Awesome RxJava

創(chuàng)建操作

真可惜簡書不支持錨點
這篇文章只是介紹操作符中的創(chuàng)建操作,其實創(chuàng)建操作包括了一些其他方面知識咧栗,比如調度器窄赋,我們會在后面的文章中講解。

Create

使用一個函數從頭開始創(chuàng)建一個Observable,并設置一個接受觀察者函數作為參數可岂,并讓其恰當的調用觀察者的onNext错敢,onError,onCompeleted方法缕粹。
(ps:建議你在傳遞給create方法的函數中檢查觀察者的isUnsubscribed狀態(tài)稚茅,以便在沒有觀察者的時候,讓其停止發(fā)射數據或者做昂貴的運算平斩。)

public static void  create() {
        Observable.create(new OnSubscribe<Integer>() {  //這里泛型所指的參數既為發(fā)射數據的類型

            @Override
            public void call(Subscriber<? super Integer> observer) {
                try {
                    if (observer.isUnsubscribed()) { //
                    for (int i = 0; i < 3; i++) {
                            observer.onNext(i);  //發(fā)射數據給觀察者
                        }
                    }
                    observer.onCompleted(); //發(fā)射完畢
                } catch (Exception e) {
                    observer.onError(e);  //發(fā)射出錯
                }
                
            }
        }).subscribe(new Observer<Integer>() {

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError :" + e.getMessage());
            }

            @Override
            public void onNext(Integer t) {
                System.out.println("onNext : " + t);
            }
        }); 
    }
}

Defer

直到有觀察者訂閱時才創(chuàng)建Observable亚享,并且為每個觀察者創(chuàng)建一個新的Observable。也就是說绘面,只要有觀察者訂閱了它欺税,就將其包含的數據全部發(fā)送給觀察者。

在這里我先補充一點揭璃,觀察者訂閱有很多種形式存在晚凿,我們可以查看subscribe的API

  public final Subscription subscribe(final Action1<? super T> onNext) {
     ...
    return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
    }
 public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError) {
        ...
        return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
    }
  public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onCompleted) {
       ...
        return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
    }

以上三種都是根據情況來設置相應參數,比如我只用處理發(fā)送過來的數據瘦馍,其他的都不管歼秽,就可以使用第一個方法,以此類推情组。

    public final Subscription subscribe(final Observer<? super T> observer) {
        if (observer instanceof Subscriber) {
            return subscribe((Subscriber<? super T>)observer);
        }
        if (observer == null) {
            throw new NullPointerException("observer is null");
        }
        return subscribe(new ObserverSubscriber<T>(observer));
    }
 public final Subscription subscribe(Subscriber<? super T> subscriber) {
        return Observable.subscribe(subscriber, this);
    }

這二個種方法比較特殊燥筷。以上方法其實最后調用的都是

Observable.subscribe(subscriber, this)

總而言之就是將訂閱者和被觀察者綁定起來。
說了這么多院崇,我們看下defer的用法:

public static void defer() {
        Observable<String> defer = Observable.defer(new Func0<Observable<String>>() {

            @Override
            public Observable<String> call() {
                return Observable.just("1","2","3") ; 
            }
        });
        Action1<String> observer1 = new Action1<String>() {
            @Override
            public void call(String t) {
                System.out.println("observer1 onNext :" + t);
            }
        };
        
        defer.subscribe(observer1);
        Subscriber<String> observer2 = new Subscriber<String>() {
            
            @Override
            public void onStart() {
                System.out.println("onStart");
            }
            
            @Override
            public void onNext(String t) {

                System.out.println("observer2 onNext :" + t);
            }
            
            @Override
            public void onError(Throwable e) {
            }
            
            @Override
            public void onCompleted() {

                System.out.println("observer2 onCompleted :");
            }
        };
        defer.subscribe(observer2);
    }

第一次使用簡書的編輯功能肆氓,發(fā)現太多的MarkDown功能都不支持。
在這個例子中亚脆,使用了Action和Subscribe作為參數綁定被觀察者做院,而且defer方法中返回的是一個Observable對象,剛好和我們之前講的會為每個觀察者創(chuàng)建一個新的Observable。這個Observable再將數據發(fā)射給觀察者键耕。

輸出結果:

observer1 onNext :1
observer1 onNext :2
observer1 onNext :3
onStart
observer2 onNext :1
observer2 onNext :2
observer2 onNext :3
observer2 onCompleted 

From

from操作可以轉換Future寺滚、Iterable和數組。對于Iterable和數組屈雄,產生的Observable會發(fā)射Iterable或者數組的每一項數據村视。

將create操作符中的示例代碼用from操作符寫出來

public static void from() {
        Integer[] ints = {1,2,3};
        Observable.from(ints)
                    .subscribe(new Observer<Integer>() {
                        @Override
                         public void onCompleted() {
                            System.out.println("onCompleted");
                        }
                        @Override
                        public void onError(Throwable e) {
                            System.out.println("onError :" + e.getMessage());
                        }
                        @Override
                        public void onNext(Integer t) {
                            System.out.println("onNext : " + t);
                        }
                    });
    }

這種方法簡單,但是不能判斷出是否觀察者取消了訂閱酒奶,可能會造成浪費蚁孔。

Interval

創(chuàng)建一個按固定時間間隔發(fā)射整數序列的Observable。

    public static void interval() {
        Observable.interval(1000,TimeUnit.MILLISECONDS,Schedulers.immediate())
                    .subscribe(new Action1<Long>() {
                        @Override
                        public void call(Long value) {
                            // TODO Auto-generated method stub
                            System.out.println("interval value : " + value);
                        }
                    });
    }

Just

Just類似于From,但是From會將數組取出然后逐個發(fā)射惋嚎,而Just只是簡單的原樣發(fā)射杠氢。

    Observable.just("hello","world")
                    .observeOn(Schedulers.immediate())
                    .subscribe(new Action1<String>() {

                        @Override
                        public void call(String t) {
                            // TODO Auto-generated method stub
                            System.out.println(Thread.currentThread().getName());
                            System.out.println(t);
                        }
                    });

Range

發(fā)射一個范圍類有序的整數序列,你可以指定范圍的起始和長度


        Observable.range(0, 10)
                    .subscribe(new Action1<Integer>() {

                        @Override
                        public void call(Integer t) {
                            // TODO Auto-generated method stub
                            System.out.println(t);
                        }
                    });

Repeat

        Observable.just("1","2")
        .repeat(3)
        .subscribe(new Observer<String>() {

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("error : "+e.getMessage());
            }

            @Override
            public void onNext(String t) {
                System.out.println(t + "  " + Thread.currentThread().getName());
            }
        });

Timer

創(chuàng)建一個Observable另伍,它在一個給定的延遲會發(fā)射一個特殊的值(0)

Observable.timer(5, TimeUnit.SECONDS)
                    .subscribe(new Action1<Long>() {

                        @Override
                        public void call(Long t) {
                                System.out.println("hello world!");
                        }
                    });
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末鼻百,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子摆尝,更是在濱河造成了極大的恐慌温艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堕汞,死亡現場離奇詭異勺爱,居然都是意外死亡,警方通過查閱死者的電腦和手機讯检,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門琐鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人视哑,你說我怎么就攤上這事绣否√苎模” “怎么了挡毅?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暴构。 經常有香客問我跪呈,道長,這世上最難降的妖魔是什么取逾? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任耗绿,我火速辦了婚禮,結果婚禮上砾隅,老公的妹妹穿的比我還像新娘误阻。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布究反。 她就那樣靜靜地躺著寻定,像睡著了一般。 火紅的嫁衣襯著肌膚如雪精耐。 梳的紋絲不亂的頭發(fā)上狼速,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音卦停,去河邊找鬼向胡。 笑死,一個胖子當著我的面吹牛惊完,可吹牛的內容都是我干的僵芹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼小槐,長吁一口氣:“原來是場噩夢啊……” “哼淮捆!你這毒婦竟也來了?” 一聲冷哼從身側響起本股,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤攀痊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拄显,有當地人在樹林里發(fā)現了一具尸體苟径,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年躬审,在試婚紗的時候發(fā)現自己被綠了棘街。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡承边,死狀恐怖遭殉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情博助,我是刑警寧澤险污,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站富岳,受9級特大地震影響蛔糯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜窖式,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一蚁飒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萝喘,春花似錦淮逻、人聲如沸琼懊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肩碟。三九已至,卻和暖如春凸椿,著一層夾襖步出監(jiān)牢的瞬間削祈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工脑漫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留髓抑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓优幸,卻偏偏與公主長得像吨拍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子网杆,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容

  • 作者: maplejaw本篇只解析標準包中的操作符羹饰。對于擴展包,由于使用率較低碳却,如有需求队秩,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,661評論 8 93
  • 注:只包含標準包中的操作符昼浦,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,193評論 2 8
  • RxJava正在Android開發(fā)者中變的越來越流行馍资。唯一的問題就是上手不容易,尤其是大部分人之前都是使用命令式編...
    劉啟敏閱讀 1,864評論 1 7
  • 本篇文章介主要紹RxJava中操作符是以函數作為基本單位关噪,與響應式編程作為結合使用的鸟蟹,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,855評論 0 10
  • 下方展示了幾種創(chuàng)建Observable的方法 just() ---將一個或者多個對象轉換成發(fā)射這個或這些對象的一個...
    菜鳥_一枚閱讀 264評論 0 0