RxJava原理学习

RxJava原理学习这是对 RxJava 设计模式以及源码的介绍

前言

本文为个人学习RxJava框架时所作,参考了两篇大佬的文章,在文末给出了链接。我只是在这里做一个两方面的整合,方便个人学习。

总结

RxJava是一个响应式编程框架,可以非常方便的实现线程调度以及数据转换,规范代码,并且其用到了观察者模式和装饰者模式。与Retrofit框架配合较多。

1.RxJava是什么?

响应式编程框架,响应式编程是一种通过异步和数据流来构建事务关系的编程模型。能够由事件来驱动事务
RxJava利用响应式编程的优点,可以实现
①可以通过一系列链式调用,规范代码
②能够通过subscribeOnobserveOn两个方法实现线程切换,通过Map,FlatMap等操作符实现中间事件的转换。
③与Retrofit框架配合使用较多








2.RxJava的线程调度

线程调度只有subscribeOn()observeOn()两个方法。
subscribeOn()它指示Observable在一个指定的调度器上创建(只作用于被观察者创建阶段)。只能指定一次,如果指定多次则以第一次为准
observeOn()指定在事件传递(加工变换)和最终被处理(观察者)的发生在哪一个调度器。可指定多次,每次指定完都在下一步生效。




3.RxJava的操作符

常用的是Map和FlatMap。

①关于Map的使用例子
 Observable.just(getFilePath()) //使用map操作来完成类型转换 .map(new Func1<String, Bitmap>() { 
    @Override public Bitmap call(String s) { 
    //显然自定义的createBitmapFromPath(s)方法,是一个极其耗时的操作 return createBitmapFromPath(s); } }) .subscribe( //创建观察者,作为事件传递的终点处理事件  new Subscriber<Bitmap>() { 
    @Override public void onCompleted() { 
    Log.d("DDDDDD","结束观察...\n"); } @Override public void onError(Throwable e) { 
    //出现错误会调用这个方法 } @Override public void onNext(Bitmap s) { 
    //处理事件 showBitmap(s) } ); 
②关于FlatMap的例子

需求:查找一个学校每个班级的每个学生,并打印出来。

//创建被观察者,获取所有班级 Observable.from(getSchoolClasses()) .flatMap(new Func1<SingleClass, Observable<Student>>() { 
    @Override public Observable<Student> call(SingleClass singleClass) { 
    //将每个班级的所有学生作为一列表包装成一列Observable 
   
     ,将学生一个一个传递出去 
    return Observable.from(singleClass.getStudents()); } }) .subscribe( //创建观察者,作为事件传递的终点处理事件  new Subscriber<Student>() { 
    @Override public void onCompleted() { 
    Log.d("DDDDDD","结束观察...\n"); } @Override public void onError(Throwable e) { 
    //出现错误会调用这个方法 } @Override public void onNext(Student student) { 
    //接受到每个学生类 Log.d("DDDDDD",student.getName()) } ); 

解释:FlatMap可以再次包装新的Observable,而每个Observable都可以使用from(T[])方法来创建自己,这个方法接受一个列表,然后将列表中的数据包装成一系列事件。
在这里就是,singleClass.getStudents()返回Student集合,然后Observable.from(这个Student集合),可以依次将Student集合中的每一个元素Student包装成Observable返回,并传递下去

4.RxJava的观察者模式

4.1 用到的类的介绍

RxJava的观察者模式是扩展的观察者模式,一个被观察者对应一个观察者。涉及的类有

其中事件有

4.2 原理

有一个泛型类,包装了Observer,即CreateEmitter类。在Observable调用subscribe传入Observer的时候,会首先把ObserverCreateEmitter包裹起来,然后当有事件发生的时候,通过这个包裹了Observer的发射器CreateEmitter发射事件,最终调用到Observer里面的相应方法。
同时注意,在RxJava里面是被观察者订阅观察者。但背后还是观察者订阅的被观察者,之所以写的时候是相反的,是为了保持流失API的调用风格,以Observable为主体,一气呵成。

CreateEmitter代码如下

public class CreateEmitter<T> implements Emitter<T> { 
    final Observer<T> observer; CreateEmitter(Observer<T> observer) { 
    this.observer = observer; } @Override public void onNext(T t) { 
    observer.onNext(t); } @Override public void onError(Throwable error) { 
    observer.onError(error); } @Override public void onComplete() { 
    observer.onComplete(); } } 

Observable实现如下

public abstract class Observable<T> { 
    // 实现订阅的逻辑 public void subscribe(Observer<T> observer){ 
    // 通过将传进来的observer包装成CreateEmitter,用于回调 CreateEmitter<T> emitter = new CreateEmitter<T>(observer); // 回调订阅成功的方法 observer.onSubscribe(emitter); // 回调发射器emitter subscribe(emitter); } // 订阅成功后,进行回调 public abstract void subscribe(Emitter<T> emitter); } 

然后在observer方法中这样调用

private void observer() { 
    // 第一步,创建被观察者 Observable<String> observable = new Observable<String>() { 
    @Override public void subscribe(Emitter<String> emitter) { 
    emitter.onNext("第一次"); emitter.onNext("第二次"); emitter.onNext("第三次"); emitter.onComplete(); } }; // 第二步,创建观察者 Observer<String> observer = new Observer<String>() { 
    @Override public void onSubscribe(Emitter emitter) { 
    Log.i("TAG", " onSubscribe "); } @Override public void onNext(String s) { 
    Log.i("TAG", " onNext s:" + s); } @Override public void onError(Throwable e) { 
    Log.i("TAG", " onError e:" + e.toString()); } @Override public void onComplete() { 
    Log.i("TAG", " onComplete "); } }; // 第三步,被观察者订阅观察者 observable.subscribe(observer); } 

5.RxJava的装饰者模式

我们在创建被被观察者的时候,会对被观察者做一层包装, 创建几次就包装几次,然后在被观察者调用subscribe方法时,一层层回调被观察者的subscribeActual方法,而在被观察者的subscribeActual方法里,会对观察者做一层包装;
也就是说被观察者是在创建的时候进行包装,然后在subscribeActual方法里实现额外的功能;
而观察者是在被观察者调用subscribeActual方法里进行包装的,然后针对观察者实现自己额外的功能;




6.参考文章

这是RxJava入门学习的文章推荐,这是对RxJava设计模式以及源码介绍的文章推荐。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225278.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:40
下一篇 2026年3月17日 上午9:40


相关推荐

  • JavaScript 数学曲线—连锁螺线

    JavaScript 数学曲线—连锁螺线引子继等角螺线 接着尝试连锁螺线 OriginMyGitH 简介在阿基米德螺线中提到的通用的公式 当 c 2 时 就是连锁螺线 又称为 Lituus 曲线 RogerCotes 在他的著作 HarmoniaMens 1722 中对该曲线进行了描述 Maclaurin 在 1722 年为曲线命名 在极坐标系中公式描述 公式说明 r 径向距离 a 常数 极角 绘制用 canvas 绘制曲线 canvas 的坐标系是笛卡尔坐标系 需

    2026年3月20日
    3
  • linux pmap 进程信息,linux之pmap命令简介

    linux pmap 进程信息,linux之pmap命令简介pmaplddstace 要熟悉的几个调试命令 这次先看下 pmap 观察到系统中的指定进程的地址空间分布情况显示一个目标文件或者链接库文件中的目标文件的各个段的大小 该文件从 proc maps 中获得数据 命令格式 pmap 范例 root localhostsec pmap d bashAddressK

    2026年3月16日
    1
  • pycharm + docker 环境创建

    pycharm + docker 环境创建吐个槽 公司不给用自己的笔记本 windows 环境莫名其妙的配置不起来 之前装了个 GPU 驱动 tensorflow 就一直装不上 hanlp 就一直装不上 后来就用 docker 公司服务器就莫名其妙的一直卡一直卡 没办法 只能用 windows docker 都是泪 pycharm 需要用专业版的 配置 docker 的环境步骤参考 https www jetbrains com help

    2026年3月27日
    2
  • Visual Studio Code前端开发工具「建议收藏」

    1.1常用的前端开发工具介绍常用的前端开发工具有IDEA、VisualStudioCode、WebStorm、HBuilder等。目前比较火的前端开发工具有WebStorm以及VsCode,下面重点介绍VsCode。 前端提示最好的是Hbuilder开发工具。1.2VsCode简介 VSCode(VisualStudioCode)是微软出的一款轻量级代码编辑器…

    2022年4月14日
    220
  • Sqoop问题解决:运行报错java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver

    Sqoop问题解决:运行报错java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.DriverSqoop问题解决:运行报错报错信息:java.lang.RuntimeException:Couldnotloaddbdriverclass:com.mysql.jdbc.Driver原因分析:未将mysql关系型数据库驱动包放到sqoop/lib目录下解决方法:将mysql关系型数据库驱动包放到sqoop/lib目录下这里需要下载mysql关系型数据库驱动包放到本地/opt/software/下mysql依赖包下载链接:https://pan.baidu.com/s

    2022年7月25日
    17
  • kafka应用场景包括_不是kafka适合的应用场景

    kafka应用场景包括_不是kafka适合的应用场景一、Kafka简介Kafka是linkedin使用Scala编写具有高水平扩展和高吞吐量的分布式消息系统。Kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是Kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性,为集群保存一些meta信息。二、mq对比

    2022年10月14日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号