RxJava一篇入门文章

226 阅读2分钟

RxJava一篇入门文章

文章非原创,是对他人文章的实践、参考和整理。

参考链接:

概念

重点:

  • RxJava 就是异步
  • RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。
  • 一个响应式编程框架
  • 最厉害之处是多种操作符,且可以自定义操作符

IAM四十二的文章中使用RxJava有个概念让我很绕,他将Observable定义为被观察者,Subscriber定义为观察者

    /**
     * 被观察者,事件源
     */
    private Observable<String> myObserveable;

    /**
     * 观察者
     */
    private Subscriber<String> mySubscriber;

很绕的原因是Subscriber中译过来是订阅者的意思。 后来看到玉刚老师的文章才理顺了。

RxJava有三个基本元素:

  • 被观察者(Observable)
  • 观察者(Observer)
  • 订阅(subscribe)

一、准备工作

引入rxjava的库

implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

二、实现

  • 简单实现

被观察者、观察者、订阅动作,一气呵成,有点感觉了没有?

        /* 创建被观察者 */
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d(TAG, "=========================currentThread name: " + Thread.currentThread().getName());
                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 integer) {
                Log.d(TAG, "======================onNext " + integer);
            }

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

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

        /* 订阅 */
        observable.subscribe(observer);

  • 简写
Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d(TAG, "=========================currentThread name: " + Thread.currentThread().getName());
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "======================onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "======================onNext " + integer);
            }

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

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

二、操作符

概念

玉刚老师举的例子

其实可以把 RxJava 比喻成一个做果汁,家里有很多种水果(要发送的原始数据),你想榨点水果汁喝一下,这时候你就要想究竟要喝什么水果汁呢?如果你想喝牛油果雪梨柠檬汁,那你就要把这三种水果混在一起榨汁(使用各种操作符变换你想发送给观察者的数据),榨完后,你就可以喝上你想要的果汁了(把处理好的数据发送给观察者

要发送的数据 -> 通过操作符处理 -> 发送给观察者

正确的做法就是使用操作符去处理数据,而观察者中只处理结果。

操作符并不是符号,而是方法。

操作符号详解:juejin.cn/post/684490…