RxJava2 operator (1)

Keywords: Java less

RxJava is a library of asynchronous, event based programs that use observable sequences on the Java VM. In short, it's the asynchronous operation tool library. It can be used to keep the code simple when it comes to complex asynchronous functions.
RxJava uses the Observer mode. The observable and the Observer implement the subscription relationship through the subscription. Let's write a simple example first. To illustrate their relationship

   /*
     * A simple example
     */
    private void SimpleExample() {
        getObservable()
                //Upstream, the thread of the observed is io thread
                //Multiple settings valid for the first time
                .subscribeOn(Schedulers.io())
                //Downstream, the thread of observer is UI thread
                //It can be set multiple times, and the thread can be switched each time
                .observeOn(AndroidSchedulers.mainThread())
                //Subscribe
                .subscribe(getObserver());
    }

    /**
     * Three ways to create an observer
     * @return
     */
    private Observable<String> getObservable() {
        Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
                     observableEmitter.onNext("cricket");
                     observableEmitter.onNext("football");
                     observableEmitter.onComplete();

            }
        });
        return  observable;
        //The second way is through fromXXX
     //   return Observable.fromArray("cricket","football");
        //The third way is just
       // return Observable.just("cricket", "football");
    }

    /**
     * Observer
     * @return
     */
    private Observer<String> getObserver() {
        return new Observer<String>() {

            /**
             * This will be called first
             * Disposable Object call dispose() method can cut off the direct connection with the observed, and no data will be received after cutting off
             * @param d
             */
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, " onSubscribe : " + d.isDisposed());
            }


            @Override
            public void onNext(String value) {              
                Log.d(TAG, " onNext : value : " + value);
            }

            /**
             * onError And the onComplete() method are mutually exclusive. An event stream is mutually exclusive
             * Cannot send both the onError event and the onComplete event
             * @param e
             */

            @Override
            public void onError(Throwable e) {

                Log.d(TAG, " onError : " + e.getMessage());
            }

            @Override
            public void onComplete() {

                Log.d(TAG, " onComplete");
            }
        };
    }

Output results:

onNext : value : cricket
onNext : value : football
onComplete

map operator

The map operator can convert the data type emitted by the observer, such as Integer to String, as follows:

 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();
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {

                        return integer + "launch";
                    }
                }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String value) {
                Log.i(TAG, "value=" + value);
            }

            @Override
            public void onError(Throwable e) {

            }

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

Output results:

 value=1launch 
 value=2launch
 value=3launch
onComplete

flatmap, concatmap operators

Data conversion of flatmap and concatmap

  /**
     * concatmap flatmap Use concatmap to ensure order
     * Convert to observable < T >
     */
    public void Example04() {
        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();
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(new Function<Integer, ObservableSource<String>>() {
                    @Override
                    public ObservableSource<String> apply(Integer integer) throws Exception {

                        return Observable.just("I am value"+integer+"");

                    }
                }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.i(TAG, s);
            }
        });

    }

Output results:

 I am value1
 I am value2
 I am value3

zip operator

zip can synthesize two observers into one observer object, as shown in the following example

 /**
     * zip Use of operators
     * Less pipes shall prevail
     */
    public void Example05() {
    //Create an observed
        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();
            }
        }).subscribeOn(Schedulers.io());
         //Create another observed
        Observable<String> observable1=Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("A");
                e.onNext("B");
                e.onComplete();
            }
        }).subscribeOn(Schedulers.io());

        Observable.zip(observable, observable1, new BiFunction<Integer, String, String>() {


            @Override
            public String apply(Integer integer, String s) throws Exception {
                Log.i(TAG,"apply"+integer+s);
                return integer+s;
            }
        }).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {


                    @Override
                    public void onSubscribe(Disposable d) {

                    }

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

                    @Override
                    public void onError(Throwable e) {

                    }

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

    }

Printed log

04-04 19:36:46.400 1823-1881/com.liuxin.rxjavademo I/RxjavaUtil: apply1A
04-04 19:36:46.400 1823-1881/com.liuxin.rxjavademo I/RxjavaUtil: apply2B
04-04 19:36:46.428 1823-1823/com.liuxin.rxjavademo I/RxjavaUtil: 1A
04-04 19:36:46.429 1823-1823/com.liuxin.rxjavademo I/RxjavaUtil: 2B
04-04 19:36:46.429 1823-1823/com.liuxin.rxjavademo I/RxjavaUtil: onComplet

take operator

Use the take operator to limit the number of data to be sent. Only the number of requested data will be sent. For example, there are 5 data to be sent below, but only 3 data will be sent using the take operator

  private void test() {
        getObservable()
                // Thread of the observed
                .subscribeOn(Schedulers.io())
                // Observer thread
                .observeOn(AndroidSchedulers.mainThread())
                //Send only 3
                .take(3)
                .subscribe(getObserver());
    }

    private Observable<Integer> getObservable() {
    //Here are five data
        return Observable.just(1, 6, 3, 4, 5);
    }

    private Observer<Integer> getObserver() {
        return new Observer<Integer>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, " onSubscribe : " + d.isDisposed());
            }

            @Override
            public void onNext(Integer value) {

                Log.d(TAG, " onNext value : " + value);
            }

            @Override
            public void onError(Throwable e) {

                Log.d(TAG, " onError : " + e.getMessage());
            }

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

Print log

 onNext value : 1
onNext value : 6
onNext value : 3
onComplete

This section will cover this first, and the next section will cover other operators.

Posted by webosb on Wed, 01 Apr 2020 19:03:51 -0700