RxJava學(xué)習(xí)之創(chuàng)建型操作符

下方展示了幾種創(chuàng)建Observable的方法

  • just() ---將一個或者多個對象轉(zhuǎn)換成發(fā)射這個或這些對象的一個Observable
  • from() --- 將一個Iterable,一個Future,或者一個數(shù)組轉(zhuǎn)換成一個Observable
  • repeat() --- 創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或者數(shù)據(jù)序列的Observable
  • repeatWhean()---創(chuàng)建一個重復(fù)發(fā)射指定數(shù)據(jù)或數(shù)據(jù)序列的Observable,它依賴于另一個Observable發(fā)射的數(shù)據(jù)
  • create()---使用一個函數(shù)從頭創(chuàng)建一個Observable
  • defer()---只有當(dāng)訂閱者訂閱才能創(chuàng)建Observable;為每個訂閱創(chuàng)建一個新的Observable
  • range()---創(chuàng)建一個發(fā)射指定范圍的整數(shù)序列的Observable
  • interval()---創(chuàng)建一個按照給定的延時之后發(fā)射單個數(shù)據(jù)的Observable
  • timer()---創(chuàng)建一個在給定的延時之后發(fā)射單個數(shù)據(jù)的Observable
  • empty()---創(chuàng)建一個什么都不做的直接通知完成的Observable
  • error()---創(chuàng)建一個什么都不做直接通知錯誤的Observable
  • never()---創(chuàng)建一個不發(fā)射任何數(shù)據(jù)的Observable

create操作符

crate操作符是所有創(chuàng)建型操作符的根,也就是說其他創(chuàng)建型的操作符最后都是通過create操作符來創(chuàng)建Observable

  • 你可以使用Create操作符從頭開始創(chuàng)建一個Observable,給這個操作符傳遞一個接受觀察者作為參數(shù)的函數(shù),編寫這個函數(shù)讓它的行為表現(xiàn)為一個Observable--恰當(dāng)?shù)恼{(diào)用觀察者的onNext,onError和onCompleted方法。

  • 一個形式正確的有限Observable必須嘗試調(diào)用觀察者的onCompleted正好一次或者它的onError正好一次,而且此后不能再調(diào)用觀察者的任何其它方法。


defer操作符

  • Defer操作符會一直等待直到有觀察者訂閱它,然后它使用Observable工廠方法生成一個Observable。它對每個觀察者都這樣做,因此盡管每個訂閱者都以為自己訂閱的是同一個Observable,事實上每個訂閱者獲取的是它們自己的單獨的數(shù)據(jù)序列。

  • 在某些情況下,等待直到最后一分鐘(就是知道訂閱發(fā)生時)才生成Observable可以確保Observable包含最新的數(shù)據(jù)。

  • defer操作符默認(rèn)不在任何調(diào)度器上執(zhí)行

    /**
     * Defer
     * Defer操作符只有當(dāng)有Subscriber來訂閱的時候才會創(chuàng)建一個新的Observable對象,
     */
    private static void test(){
        
        Observable.defer(new Func0<Observable<Long>>() {

             //注意此處的call方法沒有Subscriber參數(shù),而create操作符有Subscriber參數(shù)
            @Override
            public Observable<Long> call() {
                return Observable.just(System.currentTimeMillis());
            }
        })
        .subscribe(new Subscriber<Long>() {
            
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");      
            }
            
            @Override
            public void onNext(Long value) {
                System.out.println("onSuccess value = " + value);
            }
            
            @Override
            public void onError(Throwable error) {
                System.out.println("onError error = " + error);
            }
        });
        
    }

Just操作符

  • Just將單個數(shù)據(jù)轉(zhuǎn)換為發(fā)射那個數(shù)據(jù)的Observable。

  • Just類似于From,但是From會將數(shù)組或Iterable的數(shù)據(jù)取出然后逐個發(fā)射,而Just只是簡單的原樣發(fā)射,將數(shù)組或Iterable當(dāng)做單個數(shù)據(jù)。

注意:如果你傳遞null給Just,它會返回一個發(fā)射null值的Observable。不要誤認(rèn)為它會返回一個空Observable(完全不發(fā)射任何數(shù)據(jù)的Observable),如果需要空Observable你應(yīng)該使用Empty操作符。

  • RxJava將這個操作符實現(xiàn)為just函數(shù),它接受一至九個參數(shù),返回一個按參數(shù)列表順序發(fā)射這些數(shù)據(jù)的Observable。
/**
     * Just
     * Just操作符將某個對象轉(zhuǎn)化為Observable對象,并且將其發(fā)射出去,可以使一個數(shù)字、
     * 一個字符串、數(shù)組、Iterate對象等,是一種非常快捷的創(chuàng)建Observable對象的方法,在以后的例子里會大量使用。
     */
    private static void test(){
        
        Observable.just(System.currentTimeMillis())
        .subscribe(new Subscriber<Long>() {
            
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");      
            }
            
            @Override
            public void onNext(Long value) {
                System.out.println("onSuccess value = " + value);
            }
            
            @Override
            public void onError(Throwable error) {
                System.out.println("onError error = " + error);
            }
        });
        
    }

Defer和just操作符區(qū)別

    public static Observable<Long> DeferObservable() {
        return Observable.defer(new Func0<Observable<Long>>() {

            @Override
            public Observable<Long> call() {
                return Observable.just(System.currentTimeMillis());
            }
            
        });
    }

    public static Observable<Long> JustObservable() {
        return Observable.just(System.currentTimeMillis());
    }
    
    public static Observable<Long> deferObservable =  DeferObservable();
    public static Observable<Long> justObservable =  JustObservable();

    /**
     * Defer、Just區(qū)別
     * Defer:每次訂閱都會得到一個剛創(chuàng)建的最新的Observable對象,這可以確保Observable對象里的數(shù)據(jù)是最新的;
     * Just:每次訂閱不會創(chuàng)建的新的Observable對象
     */
    private static void test(){
        
        deferObservable.subscribe(new Observer<Long>() {
            
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");      
            }
            
            @Override
            public void onNext(Long value) {
                SimpleDateFormat  sdf =new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
                System.out.println("defer onSuccess value = " + sdf.format(new Date(value)));
            }
            
            @Override
            public void onError(Throwable error) {
                System.out.println("onError error = " + error);
            }
        });
        
        justObservable.subscribe(new Observer<Long>() {
            
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");      
            }
            
            @Override
            public void onNext(Long value) {
                SimpleDateFormat  sdf =new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
                System.out.println("just onSuccess value = " + sdf.format(new Date(value)));
            }
            
            @Override
            public void onError(Throwable error) {
                System.out.println("onError error = " + error);
            }
        });
        
    }

Interval操作符

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


/**
     * Interval
     * Interval所創(chuàng)建的Observable對象會從0開始,每隔固定的時間(long interval)發(fā)射一個數(shù)字。
     * 需要注意的是這個對象是運行在computation Scheduler,所以如果需要在view中顯示結(jié)果,要在主線程中訂閱。
     */
    private static void test5(){
        
        Observable.interval(1, TimeUnit.SECONDS,Schedulers.immediate())
        .subscribe(new Subscriber<Long>() {
            
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");      
            }
            
            @Override
            public void onNext(Long value) {
                SimpleDateFormat  sdf =new SimpleDateFormat("HH時mm分ss秒");
                System.out.println("onSuccess value = "+ value +  ", 現(xiàn)在時間:" + sdf.format(new Date()));
            }
            
            @Override
            public void onError(Throwable error) {
                System.out.println("onError error = " + error);
            }
        });
        
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,377評論 2 8
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對于擴(kuò)展包,由于使用率較低,如有需求,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 46,219評論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 1,059評論 0 3
  • 創(chuàng)建unfaseCreate(create)創(chuàng)建一個Observable(被觀察者),當(dāng)被觀察者(Observer...
    chuwe1閱讀 7,150評論 3 8
  • Today,學(xué)習(xí)RxJava 的操作符,首先獻(xiàn)出官方文檔 0 。操作符比較多,我們學(xué)習(xí)重要的常用的就好啦,就按照官...
    yoosir閱讀 424評論 0 0

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