Rxjava 基本使用 认识RxJava

安卓小白一枚,刚开始研究 RxJava,随手记录,过于基础的内容,新学习的小伙伴一起讨论,大神轻拍,有不对的地方感谢指导,立马整改!

无聊的前篇

一直都知道有RxJava这么个东西,也知道很好用。但是手里的都是遗留下来的老项目,没有用到,也没有研究,最近有点时间,赶紧恶补一下。

更无聊的基础概念 :

  • 什么是RxJava?(似乎只有我自己不知道--!!!)
    说白了就是Rx 的 Java的实现。什么是Rx?就是 Reactive Extensions的缩写。Reactive Extensions又是什么呢?英语小白的我赶紧翻开已经落了一层厚厚的灰的《牛津高阶英汉词典》!(对,我什么方面都是小白!我超白!)中文意思是 响应式扩展。意思就是......emmmmm......
    我们看官方介绍吧(-
    -|||)
    Rxjava 基本使用 认识RxJava_第1张图片
    什么是RxJava.png

好了,这里就应该知道RxJava的概念了吧! (然而我是一脸懵 B~)

好吧, 概念解释什么的官方说的很官方~
各路大神也能够给出特别好的介绍, 我这么白就不BB了!

上干货!!!

RxJava的基础实现

  • 配置 Android studio 的 gradle:
dependencies {
    ......
    implementation "io.reactivex.rxjava2:rxjava:2.2.3"
    implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
}

RxAndroid: RxJava 在Android 平台的扩展, 里面有Android 相关的一些工具 .

  • 使用:
    最基本的需要3步:
  1. 创建观察者(Observer)
  2. 创建被观察者(Observable)
  3. 订阅(Subscribe)
    有没有很眼熟! 观察者模式么不就是! 对,就酱!

开始操刀!!!!

1. 创建观察者(Observer)

Observer observer = new Observer() {
            private Disposable disposable;// 用来解除订阅

            @Override
            public void onSubscribe(Disposable d) {
                // 回调方法onSubscribe,传递参数为Disposable ,
                // Disposable相当于RxJava1.x中的Subscription,用于解除订阅
                disposable = d;
            }

            @Override
            public void onNext(Object o) {
                // TODO 观察者普通事件,把要处理的事件添加到事件队列中去
                Log.d(TAG, o.toString());
            }

            @Override
            public void onError(Throwable e) {
                // TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
                Log.d(TAG, "OnComplete");
            }
        };
 
 

其中有一个Disposable的对象,用来解除订阅,只要在想要的位置添加

 disposable.dispose();

就可以了.

2. 创建被观察者(Observable)

Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext("第一个数据");
                emitter.onNext("第二个数据");
                emitter.onComplete();
            }
        });
 
 

lambda一下:

Observable observable = Observable.create(emitter -> {
            emitter.onNext("第一个数据");
            emitter.onNext("第二个数据");
            emitter.onComplete();
        });

这是Observable.create() 添加事件, 还可以用just:

Observable observable1 = Observable.just("第一个数据", "第二个数据");

还可以用 fromArray :

 String[] words = {"第一个数据", "第二个数据"};
 Observable observable2 = Observable.fromArray(words);

你想要的,我都给你(^3^)

3. 订阅(Subscribe)

这个只要一行代码:

observable.subscribe(observer);

运行结果:


输出结果.png

结合

仔细看第三步订阅,不就是 subscribe 把观察者和被观察者连在一起吗.
有了这跟红线,观察者和被观察者快(mei)乐(xiu)幸(mei)福(sao)的在一起后:

Observable.create(emitter ->{
            emitter.onNext("第一个数据");
            emitter.onNext("第二个数据");
            emitter.onComplete();
        }).subscribe(new Observer() {
            private Disposable disposable;// 用来解除订阅

            @Override
            public void onSubscribe(Disposable d) {
                // 回调方法onSubscribe,传递参数为Disposable ,
                // Disposable相当于RxJava1.x中的Subscription,用于解除订阅
                disposable = d;
            }

            @Override
            public void onNext(Object o) {
                // TODO 观察者普通事件,把要处理的事件添加到事件队列中去
                Log.d(TAG, o.toString());
            }

            @Override
            public void onError(Throwable e) {
                // TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
                Log.d(TAG, "OnComplete");
            }
        });
 
 

好了圆满了,就酱!!

然而

翻了资料看到还有一个问题:
观察者还有一种方式:

Subscriber subscriber = new Subscriber() {
            @Override
            public void onSubscribe(Subscription s) {
                //这一步是必须,我们通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成
                //调用request()方法,会立即触发onNext()方法
                s.request(Long.MAX_VALUE);//这里是请求数量,如果没有要求可以写Long.MAX_VALUE,请求足够多的事件
                //在onComplete()方法完成,才会再执行request()后边的代码
            }

            @Override
            public void onNext(String s) {
                // TODO 观察者普通事件,把要处理的事件添加到事件队列中去
                Log.d(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                // TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
                Log.d(TAG, t.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
                Log.d(TAG, "OnComplete");
            }
        };

同样的订阅:

observable.subscribe(subscriber);

然后就


Rxjava 基本使用 认识RxJava_第2张图片
报错.png

Rxjava 基本使用 认识RxJava_第3张图片
subscribe.png

没有Subscriber 对象,说好了做彼此的好基友呢?为啥不要我了!!


Rxjava 基本使用 认识RxJava_第4张图片
你变了.jpg

但是有的时候变的往往是我们自己

上源码大法!
RxJava 1.0

public abstract class Subscriber implements Observer, Subscription {...}

RxJava 2.0

public interface Subscriber {...}

RxJava 2.0 已经按照Reactive-Streams specification规范完全的重写了。RxJava2.0 已经独立于RxJava 1.x而存在。还想着向下兼容的好事儿呢?!呵呵~~~
那么我Subscriber 就孤独没人要了吗?当让不是.
在RxJava2.0中增加被观察者的新实现:Flowable 而且支持背压呀有木有!
具体的使用和 Observable Observer的组合基本一样:

        //观察者
        ResourceSubscriber subscriber = new ResourceSubscriber() {
            @Override
            public void onStart() {
                request(Long.MAX_VALUE);//这里是请求数量,如果没有要求可以写Long.MAX_VALUE,请求足够多的事件
            }

            @Override
            public void onNext(String s) {
                // TODO 观察者普通事件,把要处理的事件添加到事件队列中去
                Log.d(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                // TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
                Log.d(TAG, t.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
                Log.d(TAG, "OnComplete");
            }
        };
        
        //可观察者,和被观察者一样的
        Flowable flowable = Flowable.create((FlowableOnSubscribe) emitter -> {
            emitter.onNext("第一个数据");
            emitter.onNext("第二个数据");
            emitter.onComplete();
        }, BackpressureStrategy.BUFFER);// 多了一个参数

        //订阅
        flowable.subscribe(subscriber);
        //取消订阅
        subscriber.dispose();

然后看一眼ResourceSubscriber是啥:

public abstract class ResourceSubscriber implements FlowableSubscriber, Disposable {....}

再看一眼FlowableSubscriber :

public interface FlowableSubscriber extends SubscSriber {...}

看到没! 我Subscriber! 穿上美丽的裙子,变成了ResourceSubscriber!!!嫁给了王子!!!(总觉得哪里不对...Observable 和 SubscSriber是曾经的基友...穿裙子...嫁给王子...)理不清了,不管了!

只是想说一句,现在的搜索引擎...emmmm...优秀!!!!
上面就是最基本的RxJava的使用了,后续再学习再更新!!!

(某大神: 这么简单的东西也要写hetui~)

你可能感兴趣的:(Rxjava 基本使用 认识RxJava)