Rxjava Learning Notes (1)

Posted by versatilewt on Sun, 15 Mar 2020 17:00:33 +0100

Rxjava Learning

Basic Usage

            Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onComplete();
            }
        });
           Observer<Integer> observer = new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe");
            }
            @Override
            public void onNext(Integer value) {
                Log.d(TAG,""+value);
            }
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError");
            }

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

        observable.subscribe(observer);


//Run Results
03-13 13:59:33.957 4183-4183/com.example.uds.recyclerviewtest D/MAP: onSubscribe
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 1
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 2
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: 3
03-13 13:59:33.958 4183-4183/com.example.uds.recyclerviewtest D/MAP: onComplete

Using Chain Calls

Observable.create(new ObservableOnSubscribe<Integer>{
    @Override
    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
          e.onNext(1);
          e.onNext(2);
          e.onNext(3);
          e.onComplete();
   }
}).subscrib(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe");
            }
            @Override
            public void onNext(Integer value) {
                Log.d(TAG,""+value);
            }
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError");
            }

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

Two key objects: ObservableEmitter and Disposable


ObservableEmitter means transmitter, which is used to send events

onNext(T value) can be sent multiple times
onComplete() can be sent once, followed by onNext, but is no longer received
onError(Throwable error) can be sent only once, onNext can be received but not anymore


Disposable means one-time, throw-away when used up. Calling dispose() method cuts off communication between upstream and downstream

Although it is disconnected, the upstream can continue to send the remaining events, and the downstream can no longer receive them.

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d(TAG,"emit 1");
                e.onNext(1);
                Log.d(TAG,"emit 2");
                e.onNext(2);
                Log.d(TAG,"emit 3");
                e.onNext(3);
                e.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG,"onSubscribe");
                mDisposable = d;
            }
            @Override
            public void onNext(Integer value) {
                Log.d(TAG,"onNext "+value);
                if(value == 2){
                    Log.d(TAG,"disposable");
                    mDisposable.dispose();
                    Log.d(TAG,"isDisposed:" + mDisposable.isDisposed());
                }
            }
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,"onError");
            }

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


//Result

03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onSubscribe
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 1
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onNext 1
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 2
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: onNext 2
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: disposable
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: isDisposedtrue
03-13 14:46:02.647 13356-13356/com.example.uds.recyclerviewtest D/MAP: emit 3

Introduction to overloading method of subscribe()

    public final Disposable subscribe() {}
    public final Disposable subscribe(Consumer<? super T> onNext) {}
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {} 
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
    public final void subscribe(Observer<? super T> observer) {}


Consumer only cares about onNext events

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                Log.d(TAG, "emit 1");
                emitter.onNext(1);
                Log.d(TAG, "emit 2");
                emitter.onNext(2);
                Log.d(TAG, "emit 3");
                emitter.onNext(3);
                Log.d(TAG, "emit complete");
                emitter.onComplete();
                Log.d(TAG, "emit 4");
                emitter.onNext(4);
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, "onNext: " + integer);
            }
        });