Android拾萃 - RxJava2之創(chuàng)建操作符及其demo

根據(jù)下圖,再一次回顧一下前面幾章的內(nèi)容,經(jīng)典的三步法等內(nèi)容。
Android拾萃 - RxJava操作符和響應(yīng)類型(二) 的圖片。

RxJava 2.x的5種響應(yīng)類型

一、創(chuàng)建操作符列表

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

二、創(chuàng)建操作符例子

Observable + 操作符?。ubscribe + observer,就構(gòu)成了一個完整的例子。
由于只是做展示,observer基本可以公用,這里寫成一個靜態(tài)變量,詳細見代碼。而對于操作符,我們可以簡單理解,就是對onexst onerror oncomplete 還有一些傳入?yún)?shù)和方法的封裝,起到簡化代碼的作用。

just.png

just 可以發(fā)射一個或者多個對象,會依次回調(diào)onNext,并最后自動調(diào)用onComplete(可以理解為對上述多個onNext和一個onComplete操作的封裝)

 private static  Observer observer = new Observer<String>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
        }

        @Override
        public void onNext(@NonNull String s) {
            Log.i(TAG, s);
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.i(TAG, "onError");
        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onCompleted");
        }
    };


 //just 發(fā)射了三個對象,會依次回調(diào)onNext,并最后自動調(diào)用onComplete
        Observable.just("A","B","C").subscribe(observer);

執(zhí)行程序,console打印信息如下:

10-19 01:02:20.758 20699-20699/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: A
10-19 01:02:20.758 20699-20699/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: B
10-19 01:02:20.758 20699-20699/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: C
10-19 01:02:20.758 20699-20699/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: onCompleted
defer.png

defer 創(chuàng)建的Observable將推遲到subscribe訂閱的時候(這個時候會調(diào)用call()方法進行發(fā)射數(shù)據(jù)),但是這個時候監(jiān)聽到的數(shù)據(jù)可能和創(chuàng)建的時候的數(shù)據(jù)不一致了,如圖上的兩種顏色,代表兩種不同數(shù)據(jù)。

//final 數(shù)組只是引用地址不變,值還是可以改變的
        final String[] str={"hi, rxjava"};
        Observable observable =Observable.defer(new Callable<ObservableSource<?>>() {
            @Override
            public ObservableSource<?> call() throws Exception {
                return Observable.just(str[0]);
            }
        });

        str[0]="hi, i have changed";

        observable.subscribe(observer);

我們看到打印信息里面 str[0]確實是改變了的

10-19 01:11:57.428 29288-29288/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: hi, i have changed
10-19 01:11:57.428 29288-29288/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: onCompleted

empty()/error()/never()

 //直接調(diào)用onComplete
        Observable.empty().subscribe(observer);
        //直接回調(diào)onError
        Observable.error(new Throwable("some error")).subscribe(observer);
        //啥事不干
        Observable.never().subscribe(observer);
10-19 01:13:56.228 31014-31014/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: onCompleted
10-19 01:13:56.228 31014-31014/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: onError
fromArray.png

rxjava1 是from 而rxjava2 應(yīng)該是fromArray,圖上是不對的。fromArray 發(fā)射的是一個數(shù)組對象,但是卻可以依次接收到數(shù)組的各個元素,其實just最終調(diào)用的也是fromArray

        Observable.fromArray(new String[]{"A","B","C"}).subscribe(observer);
10-19 01:17:20.618 1368-1368/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: A
10-19 01:17:20.618 1368-1368/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: B
10-19 01:17:20.618 1368-1368/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: C
10-19 01:17:20.628 1368-1368/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: onCompleted

repeat() 默認是Long.MAX_VALUE,即無限重復(fù),repeat(5)表示重復(fù)5次。
repeat 和 retry 的操作符都有相對應(yīng)的操作符,但是兩類操作符是有區(qū)別的。
.repeat()是接收到.onCompleted()事件后觸發(fā)重訂閱。而.retry()接收到.onError()事件后觸發(fā)重訂閱。

        Observable.just("A").repeat().subscribe(observer);
        Observable.just("A","B","C").repeat(5).subscribe(observer);
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: A
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: B
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: C
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: A
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: B
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: C
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: A
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: B
10-19 01:20:21.148 4994-4994/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: C
10-19 01:20:21.
repeatWhen.f.png

range(1, 5) 從1開始發(fā)射到5
repeatWhen 需要傳入一個方法或者條件,包裝方法我們可以使用flatMap

我們就來實現(xiàn)一個定時器例子
使用timer(5秒執(zhí)行一次),即5秒repeat一次

timer.p.png

怎么寫出以下代碼,基本我們知道需求和使用什么操作符,按照代碼提示就可以寫了,多敲敲代碼才是王道~

        Observable.range(1, 5).repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(@NonNull Observable<Object> objectObservable) throws Exception {

                return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(@NonNull Object o) {

                        return Observable.timer(5, TimeUnit.SECONDS);
                    }
                });
            }
        }).subscribe(observer);
//range發(fā)射的是int值的,前面observer是String泛型的,所以這里也需要更改
 private static  Observer observer = new Observer<Integer>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
        }

        @Override
        public void onNext(@NonNull Integer s) {
            Log.i(TAG, s+"");
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.i(TAG, "onError");
        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onCompleted");
        }
    };
10-19 01:24:30.928 9114-9114/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 1
10-19 01:24:30.928 9114-9114/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 2
10-19 01:24:30.928 9114-9114/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 3
10-19 01:24:30.928 9114-9114/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 4
10-19 01:24:30.928 9114-9114/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 5

10-19 01:24:35.948 9114-9332/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 1
10-19 01:24:35.948 9114-9332/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 2
10-19 01:24:35.948 9114-9332/com.example.philos.rxjavademo I/Cre

ateOperateExampleActiivty: 3
10-19 01:24:35.948 9114-9332/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 4
10-19 01:24:35.948 9114-9332/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 5
interval.png

interval 每秒發(fā)射一次,并且遞增.這里發(fā)射的是long類型的數(shù)據(jù),所以observer也需要重寫

    private static  Observer observer = new Observer<Long>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
        }

        @Override
        public void onNext(@NonNull Long s) {
            Log.i(TAG, s+"");
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.i(TAG, "onError");
        }

        @Override
        public void onComplete() {
            Log.i(TAG, "onCompleted");
        }
    };

        Observable.interval(1, TimeUnit.SECONDS).subscribe(observer);
10-19 01:29:57.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 0
10-19 01:29:58.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 1
10-19 01:29:59.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 2
10-19 01:30:00.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 3
10-19 01:30:01.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 4                 
 beginning of /dev/log/system
10-19 01:30:02.838 11742-12139/com.example.philos.rxjavademo I/CreateOperateExampleActiivty: 5

最后編輯于
?著作權(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)容

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