RxJava2.0——入门教程

了解观察者模式

简单介绍一下,A和B两个,A是被观察者,B是观察者,B对A进行观察,B并不是需要时刻盯着A,而是A如果发生了变化,会主动通知B,B会对应做一些变化。举个例子,假设A是连载小说,B是读者,读者订阅了连载小说,当小说出现了新的连载的时候,会推送给读者。读者不用时刻盯着小说连载,而小说有了新的连载会主动推送给读者。这就是观察者模式。而RxJava正是基于观察者模式开发的

在这里插入图片描述

RxJava2.0 基本使用

首先引入RxJava2.0相关的类库

implementation 'io.reactivex.rxjava2:rxjava:2.2.14'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

第一步:创建连载小说(被观察者)

//被观察者
        Observable novel = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("连载一");
                emitter.onNext("连载二");
                emitter.onNext("连载三");
                emitter.onComplete();
            }
        });

Observable 中文意思就是被观察者,通过 create 方法生成对象,里面放的参数ObservableOnSubscribe<T>,可以理解为一个计划表,泛型 T 是要操作对象的类型,重写 subscribe 方法,里面写具体的计划,本文的例子就是推送连载1、连载2和连载3,在 subscribe 中的ObservableEmitter<String>对象的 Emitter 是发射器的意思。ObservableEmitter 有三种发射的方法,分别是void onNext(T value)void onError(Throwable error)void onComplete(),onNext 方法可以无限调用,Observer(观察者)所有的都能接收到,onError 和onComplete 是互斥的,Observer(观察者)只能接收到一个,OnComplete 可以重复调用,但是 Observer(观察者)只会接收一次,而 onError 不可以重复调用,第二次调用就会报异常。

第二步:创建读者(观察者)

//观察者
        Observer reader = new Observer() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                mDisposable=d;
                Log.e(TAG,"onSubscribe()");
            }

            @Override
            public void onNext(@NonNull Object o) {
                if ("2".equals(o)){
                    mDisposable.dispose();
                    return;
                }
                Log.e(TAG,"onNext()"+o);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG,"onError():"+e.getMessage());
            }

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

通过 new 创建接口,并实现其内部的方法,看方法其实就应该差不多知道干嘛的,onNextonErroronComplete 都是跟被观察者发射的方法一一对应的,这里就相当于接收了。onSubscribe(Disposable d)里面的 Disposable 对象要说一下,Disposable 英文意思是可随意使用的,这里就相当于读者和连载小说的订阅关系,如果读者不想再订阅该小说了,可以调用 mDisposable.dispose()取消订阅,此时连载小说更新的时候就不会再推送给读者了

第三步:读者和连载小说建立订阅关系

//建立联系
novel.subscribe(reader);

在这里细心的你,可能已经发现了怎么是小说订阅了读者,之所以这样,是因为RxJava主要是想保持自己的链式编程,不得不把Observable(被观察者)放在前面,这里大家可以理解为小说被读者订阅了

运行结果
在这里插入图片描述
这就是RxJava2.0最最简单的用法

RxJava2.0的异步和链式编程

RxJava 是支持异步的,但是 RxJava 是如何做到的呢?这里就需要 Scheduler。Scheduler,英文名调度器,它是 RxJava 用来控制线程。当我们没有设置的时候,RxJava 遵循哪个线程产生就在哪个线程消费的原则,也就是说线程不会产生变化,始终在同一个。然后我们一般使用 RxJava 都是 后台执行,前台调用,本着这个原则,我们需要调用observeOn(AndroidSchedulers.mainThread()),observeOn 是事件回调的线程,AndroidSchedulers.mainThread() 一看就知道是主线程,subscribeOn(Schedulers.io()),subscribeOn 是事件执行的线程,Schedulers.io() 是子线程,这里也可以用Schedulers.newThread(),只不过 io 线程可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。前面的代码根据异步和链式编程的原则,我们可以写成

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("连载一");
                emitter.onNext("连载二");
                emitter.onNext("连载三");
                emitter.onComplete();
            }
        }).observeOn(AndroidSchedulers.mainThread())//回调在主线程
                .subscribeOn(Schedulers.io())//执行在io线程
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        mDisposable = d;
                        Log.e(TAG, "onSubscribe()");
                    }

                    @Override
                    public void onNext(@NonNull Object o) {
                        if ("2".equals(o)) {
                            mDisposable.dispose();
                            return;
                        }
                        Log.e(TAG, "onNext()" + o);
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        Log.e(TAG, "onError():" + e.getMessage());
                    }

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

这里就是 RxJava 最常用的写法,异步+链式编程,还要再说一下,subscribe 的方法重载,subscribe() 方法里什么参数也不放是空实现,也就是说连载小说无论出什么连载,读者都不关心,推送过来了也不读,如果读者只关心 onNext 方法里的内容,可以直接重载subscribe(Consumer<? spuer T> onNext)这个方法,会减少代码,当然如果是初学者还是建议创建Observer对象

参考文章:
RxJava2.0——从放弃到入门
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程

接下来可以继续学习
Android RxJava:最基础的操作符详解 - 创建操作符
作者写的Rxjava系列文章很好,先学完再说

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值