RXJava基本原理

什么是RXjava

RxJava是近两年来越来越流行的一个异步开发框架,使用起来十分简单方便,功能保罗万象,十分强大

首先以代码的执行顺序来描述RXJava,回答几个问题

RxJava框架内部的主干逻辑是怎样的?
RxJava究竟是如何实现一句话线程切换的?
多次调用subscribeOn()或observeOn()切换线程会有什么效果?

回答了这几个问题之后,我们大概就能对RxJava的基本原理有初步的认识了

RxJava的基本角色

一般我们使用RxJava都是编写类似如下的代码:

//创建一个事件流,参数是我们创建的一个事件源
Observable.create(new ObservableOnSubscribe()) 
                .map(...)//有时我们会需要使用操作符进行变换
                .subscribeOn(Schedulers.io())//指定事件源代码执行的线程
                .observeOn(AndroidSchedulers.mainThread())//指定订阅者代码执行的线程
                .subscribe(new Observer())//参数是我们创建的一个订阅者,在这里与事件流建立订阅关系

RxJava是一种基于观察者模式的响应式编程框架,其中的主要角色有:

Observable 是RxJava描述的事件流,在链式调用中非常清晰,事件从创建到加工处理再被订阅者接收到,就是一个接一个的Observable形成的一个事件流.在上面代码中,每一步方法的调用,都会返回一个新的Observable给下一步,这个是RxJava源码的基础。同样是链式调用 ,但它与我们常见的Builder模式不太一样,每个操作符,每次线程切换,每步都会新建一个Observable而非直接加工上一步的Observable返回给下一步.(在源码中不同的加工会创建不同的Observable,比如map()会创建一个ObservableMap,subscribeOn()会创建一个ObservableSubscribeOn,但他们实际上都是Observable的子类)。

ObservableOnSubscribe是这个时间流的源头,下面我们称之为事件源,一般由我们创建并传入,我们创建时,需要重写其subscribe()方法,为了和Observable中的subscribe()方法区别,我们将在下面贴出的代码中将其改名为call()。我们在调用链中有时会用到各种操作符进行一些变换,事实上每个操作符都会重写这么一个call()方法,相对于我们创建事件源时在这里写入的源业务代码,这些操作符在这里要做的事是由RxJava钦定的,一般是连接事件流的上下游。在这里我们将准备好被订阅的数据,并调用subscribe()参数中ObservableEmitter的onNext(),onCompleted()或onError()通知订阅者数据准备情况。

Observer 是整个事件流的订阅者,也就是说,它将会订阅前面事件创建,加工以后的最终结果。它也是由我们创建的,我们将要重写它的onNext(),onCompleted(),onError()和onSubscribe(),在接下来的分析中我们将简化一些,只关注onNext()。我们创建出了Observer以后,将会使用经过上面所有步骤的最后一步生成的Observable,调用它的subscribe(),与事件源产生联系。

最简单的情况

最简单的情况,就是没有使用操作符,没有切换线程.我们写的调用代码是下面这样的(以下源码都是精简、改写过后的主干逻辑代码),为了区分,将ObservableOnSubscribe中的subscribe()改成 call(),代码如下:

Observable.create(new ObservableOnSubscribe<Object>(){
   

	    @Override
            public void call(@NonNull Observer<Object> e) throws Exception {
   
                //事件源业务代码
                e.onNext(o);
            }
        }).subscribe(new Observer<Object>() {
   

            @Override
            public void onNext(@NonNull Object o) {
   
                //订阅者业务代码
            }
        });

订阅者中我们暂时只关注onNext().我们在这里,创建了一个事件源,一个订阅者,并以订阅者为参数调用了subscribe().那么其中的调用过程是怎么样的呢?
我们跟进源码看看.

先看Observable类的静态方法create();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值