iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0

其實Rxjava還有許多的功能用法,我覺得一定要介紹的就是它有許多觀察者模式(Observable),今天來帶大家來看看各個**觀察者模式(Observable)**的特性及差別吧。

觀察者模式(Observable)

Observable

在需要多次執行的內容時使用,每一次執行就會進入onNext(),完成時則進入onComplete()。

callback

  • onSubscribe():發生訂閱關係時進入。
  • onNext():多次執行時會進入。
  • onComplete():完成時進入。
  • onError(Throwable e):發生錯誤時進入。

範例

Observable.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Log.e("Tag", "Completable: 建立" );
                return null;
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {
                
            }
            
            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

Completable

在執行的內容不需要有回傳值,只要知道執行成功與否時使用,例如更新、刪除資料等。

callback

  • onSubscribe():發生訂閱關係時進入。
  • onComplete():完成時進入。
  • onError(Throwable e):發生錯誤時進入。

範例

Completable.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Log.d("Completable", "Completable: 建立" );
                return null;
            }
        }).subscribe(new CompletableObserver() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d("Completable", "onSubscribe" );
            }

            @Override
            public void onComplete() {
                Log.d("Completable", "onComplete" );
            }

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

Maybe

在執行後不一定需要有回傳值時使用,例如資料庫的查詢,如果有找到需要的資料則會進入onSuccess(),若無則進入onComplete()。

callback

  • onSubscribe():發生訂閱關係時進入。
  • onSuccess():有結果時進入。
  • onComplete():無結果並完成時進入。
  • onError(Throwable e):發生錯誤時進入。

範例

Maybe.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Log.d("Maybe", "Maybe: 建立" );
                return null;
            }
        }).subscribe(new MaybeObserver<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d("Maybe", "onSubscribe" );
            }

            @Override
            public void onSuccess(@NonNull Object o) {
                Log.d("Maybe", "onSuccess" );
            }

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

            @Override
            public void onComplete() {
                Log.d("Maybe", "onComplete" );
            }
        });

Single

在執行後一定需要有回傳值時,例如API Get 資料時。此時會進入onSuccess()。

callback

  • onSubscribe():發生訂閱關係時進入。
  • onSuccess():獲得結果時進入。
  • onError(Throwable e):發生錯誤時進入。

範例

Single.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Log.e("Single", "Single: 建立" );
                return null;
            }
        }).subscribe(new SingleObserver<Object>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d("Single", "onSubscribe" );
            }

            @Override
            public void onSuccess(@NonNull Object o) {
                Log.d("Single", "onSuccess" );
            }

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

Flowable

用法與Observable差不多,最主要差別是Flowable支持back pressure,也就是在被觀察者發送事件的速度過快以至於觀察者無法處理時,會降低被觀察者發送事件的速度,以避免錯誤的產生。

callback

  • onSubscribe():發生訂閱關係時進入。
  • onNext():多次執行時會進入。
  • onComplete():完成時進入。
  • onError(Throwable e):發生錯誤時進入。

範例

Flowable.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                Log.d("Flowable", "Flowable: 建立" );
                return null;
            }
        }).subscribe(new FlowableSubscriber<Object>() {
            @Override
            public void onSubscribe(@NonNull Subscription s) {
                Log.d("Flowable", "onSubscribe" );
            }

            @Override
            public void onNext(Object o) {
                Log.d("Flowable", "onNext" );
            }

            @Override
            public void onError(Throwable t) {
                Log.e("Flowable", "onError" );
            }

            @Override
            public void onComplete() {
                Log.d("Flowable", "onComplete" );
            }
        });

可以看出以上的差別主要在callback進的時機及情況上,可以對應自己的執行需求使用對應的模式喔,善用這些模式也可以幫助程式碼變得更有效率,rxjava也就先介紹到這邊,也期待各為在熟悉這些後,可以繼續研究rxjava,發覺更多rxjava的強大。


上一篇
精華筆記 Day 21 --RxJava(1)
下一篇
精華筆記 Day23 -- Retrofit
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言