源码解析RxBus实现观察者模式

RxBus:RxBus像老狗一样稳定 下载 Gradle: implementation " com.blankj:rxbus:1.6 " 如何使用 非粘性事件 注册事件 public class YourActivity extends Activity { @Override protected void onCreate ( Bundle savedInstanceState ) { super . onCreate(savedInstanceState); setContentView( R . layout . activity_main); // 注册 String 类型事件 RxBus . getDefault() . subscribe( this , new RxBus . Callback< String> () { 立即下载
一句话描述RxJava实现观察者模式的过程
  • 事件从Observable中发出,在Observer中接收并由Observer处理
RxJava实现观察者模式:四个基本概念,三个步骤
四个基本概念:
  • Observable
  • Observer
  • subscribe
  • 事件
三个步骤:
  • 创建Observer
  • 创建Observable
  • subscribe(订阅)
接下来逐步解析每一个过程
Observer创建

Observer observer = new Observer() {
@Override
 public void onCompleted() {

 }

 @Override
 public void onError(Throwable e) {

 }


 @Override
 public void onNext(Object o) {

 }
 };





也可以用Subscriber,这里先以Observer为例进行说明。
中规中矩的创建方式,并没什么新奇,神奇的地方在Observable。

Observable的创建

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {

@Override
 public void call(Subscriber<? super String> subscriber) {

subscriber.onNext("");

subscriber.onCompleted();

subscriber.onError(new Throwable());


}
});


我们看一下Observable.create 方法

public static <T> Observable<T> create(OnSubscribe<T> f) {

return new Observable<T>(hook.onCreate(f));
}

  • 可以看出,内部调用了new方法新建了一个对象,这一步看上去没什么神奇,实际上也确实不神奇。神奇的是传入了一个Observable.OnSubscribe接口实现作为入参。
接下来就让我们看一下神奇的Observable.OnSubscribe

public interface OnSubscribe<T> extends Action1<Subscriber<? super T>> {

// cover for generics insanity

}

# OnSubscribe继承自Action1,我们来看一下Action1的定义

public interface Action1<T> extends Action {

void call(T t);

}

那么我们写出OnSubscribe的完整定义

public interface OnSubscribe<T> extends Action1<Subscriber<? super T>> {
void call(Subscriber<? super T> subscriber);

}

我们一般在OnSubscribe的call方法中调用subscriber中的方法。也就是说,我们在OnSubscribe的call方法中调用了哪个 subscriber,哪个subscriber的方法会触发。而我们所希望的是,这里作为参数传递过来的subscriber是我们在第一步中创建出来的observer,因为如果真是这样的话,我们观察者模式就可以串起来了。

那么作为参数传入的subscriber究竟是谁呢?而call方法是什么时候调用的呢?

为了搞清楚这个问题,我们来看一下RxJava实现观察者模式的第三步(最后一步)

subscribe(订阅)
observable.subscribe(observer);
看observable.subscribe源码:

public final Subscription subscribe(final Observer<? super T> observer) {

if (observer instanceof Subscriber) {

return subscribe((Subscriber<? super T>)observer);

}

return subscribe(new ObserverSubscriber<T>(observer));

}

这段代码比较有意思,如果传入的参数是Subscriber,则调用

public final Subscription subscribe(Subscriber<? super T> subscriber) {

return Observable.subscribe(subscriber, this);

}

否则将传入的observer包装成了Subscriber,调用上述方法。

而上面的方法仅调用了subscribe(Subscriber

为了更清楚的看清其中的逻辑,这里只保留了逻辑相关的代码

static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {

……….
try {

// allow the hook to intercept and/or decorate

hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
-------------------------------

return hook.onSubscribeReturn(subscriber);

} catch (Throwable e) {

……
return Subscriptions.unsubscribed();

}
}

这里的subscriber实际上(直接或间接)就是observer

看分割线上面那行代码:
参考这个hook.onSubscribeStart

public <T> OnSubscribe<T> onSubscribeStart(Observable<? extends T> observableInstance, final OnSubscribe<T> onSubscribe) {

// pass through by default

return onSubscribe;

}

我们可以把那行代码写成这样
`onSubscribe.call(subscriber);`
也就是说,在subscribe方法中,调用了
`onSubscribe.call(subscriber);`
总结

到这里,就完全通顺下来了。

  • 第一步 创建Observer
  • 第二步 Observable 创建实例,并通过Observable的create持有OnSubscribe
  • 第三步 Observable subscribe方法,通过调用第二步传入的OnSubscribe的call方法,间接调用第一步产生的observer中的方法

最后借用睿智的狄公的一句话结尾:事情的经过就是这个样子的。

RxBus-和EventBus完全一样 是否有这样的纠结:已经使用rxjava和rxAndroid到你的项目中,但是项目中又同时存在eventbus;因为rx完全可以替换掉eventbus所以导致了过多引入第三方jar包的问题,对于有代码洁癖和瘦身需求的同学们来说简直是一个噩耗; 如何在最大基础上修改我们已经存在的代码呢,那就是改造一个自己的rxbus,让他使用起来和eventbus一模一样,这样我们只需要将eventbus改名成rxbus即可,其他代码都不需要修改! 具体实现过程:http://blog.youkuaiyun.com/wzgiceman/article/details/52701265 立即下载

相关推荐

SMARTFORMS实战:用Template+Loop实现复杂表格布局(附避坑指南)

本文深入解析了SMARTFORMS中Template与Loop组合实现复杂表格布局的实战技巧,突破传统TABLE组件的限制。通过多级表头、单元格合并等案例演示,提供从基础架构搭建到动态数据绑定的完整解决方案,并分享性能优化与异常处理的最佳实践,助力开发者高效应对企业级报表设计挑战。

numpy6sculptor的博客 805

Hystrix学习之观察者模式

Hystrix:1.5.18,rxjava:1.2.0没错Hystrix中的观察者模式实现使用的正是优秀的rxjava开源类库,我们跟着官网的HystrixCommandAsyncDemo案例代码来一步步走进这个优秀的开源库 开始演示 初始化Hystrix请求上下文HystrixRequestContext.initializeContext 观察模拟订单确认和信用卡支付的用户请求observ...

阿呆的专栏 1045

第1章:Zephyr 开发环境搭建与 Hello World

📝【摘要】本文是Zephyr RTOS开发入门指南的第一章,详细介绍了从环境搭建到首个应用运行的完整流程。主要内容包括:1️⃣ Zephyr项目结构解析与west工具链部署;2️⃣ 开发环境配置(Linux/WSL)及SDK安装;3️⃣ 两种实践路径——官方HelloWorld样例与自定义应用开发;4️⃣ 实际硬件部署方法(nRF/STM32)及常用west命令速查;5️⃣ 典型问题解决方案。通过qemu_x86模拟器演示了基础打印功能实现,为后续深度开发奠定基础。

hemoparrot的专栏 1361

RxJava基本原理与使用(二)

上一篇我们了解了RxJava的介绍以及通过一个例子学习了RxJava的展现形式,相信大家现在已经对RxJava有一个初步的印象与概念了。本篇我们将更深入的学习RxJava的基本原理以及如何使用RxJava。

LeiHolmes的博客 696

单细胞分析(16)—— RNA Velocity 分析流程

RNA velocity 是一种强大的单细胞转录组分析工具,它可以预测细胞的未来状态,揭示发育轨迹,并用于探索细胞状态转换。RNA velocity 是一种通过单细胞 RNA 测序(scRNA-seq)数据推测细胞未来状态的分析方法。🚀**RNA velocity 提供了一个全新的角度来理解细胞的动态变化,为单细胞转录组分析带来了更深入的时空信息!

阅读文献,记录学习笔记 2980

别再傻傻分不清了!STM32定时器里Prescaler和ClockDivision到底有啥区别?

本文深入解析STM32定时器中Prescaler和ClockDivision的区别与应用场景。Prescaler作为定时器的'心跳调节器',决定计数频率;而ClockDivision则是输入捕获的'抗噪滤镜',有效抑制高频噪声。通过实战案例和示波器实测数据,帮助开发者避免常见配置误区,提升嵌入式系统稳定性。

weixin_29193259的博客 319

从RxBus开始改变,源码要这么看,才算没白看

这篇文章,打算 换个编写的方式去编写。旨在改变写法,提升质量。 目录结构如下 源码简介(大致讲述环境) 这些问题怎么实现?(带着问题去看源码) 流程图级目录结构(讲函数的用途) 函数解析(讲如何实现) 小结(讲最简洁的 核心思想&个人理解) 带着问题继续前行 源码简介 RxBus版本: v2.0.1 源码地址: github链接 简介: RxBus与EventBus功能上差不多,...

王学明 762

Python遥感图像处理应用篇(二十三):Python+GDAL 批量拼接图像

遥感影像拼接分多种不同的情况,比如比较常用的是两幅影像拼接或者多个图像合并为一个图像。GDAL中实现影像拼接的方式也有多种,比如常用可以通过numpy读取影像数组,并计算各个图像的numpy数组范围,合并多个numpy数组为一个最终的结果,并将其重新输出为一幅新的图像,即可实现图像的拼接。另外比较方便的一种方法便是使用GDAL.warp()函数方法。这个函数的功能很多,可以实现多种不同的目的,比如用于坐标系转换、投影变换、图像合并与镶嵌、地理范围裁剪、更改分辨率、矢量裁剪等多种功能。这些功能可以通过设置Op

soderayer的博客 4643

RxBus的实现及简单使用

原文链接:http://lingyunzhu.github.io RxJava目前已经很火了,如果你尚未了解请看这里。对于RxJava这里不多做介绍。RxBus并不是一个库,而是一种模式。相信大多数开发者都使用过EventBus,作为事件总线通信库,如果你的项目已经加入RxJava和EventBus,不妨用RxBus代替EventBus,...

weixin_33690367的博客 222

8、硬件工程师笔试面试知识器件篇——二极管(2025版本)

当二极管正向偏置时(阳极相对于阴极为正电压),PN结内部的电场减小,允许电子和空穴复合,形成电流。而当二极管反向偏置时,PN结的电场增强,阻止电流通过。在接触区域,P型半导体中的空穴和N型半导体中的自由电子会相互扩散和复合,形成一个没有自由载流子的耗尽区。在设计电子电路时,平衡二极管的正向电压降(Vf)和最大电流(I)是一个重要的考虑因素,因为这两者直接影响电路的性能和效率。通过这些步骤,可以确保在设计电子电路时选择的二极管能够安全地处理预期的最大正向电流和最大反向电压,从而提高电路的可靠性和安全性。

XU157303764的博客 3501

【优化求解】基于matlab粒子群算法PSO确定最佳开关角对称级联多层逆变器【含Matlab源码 13080期】

粒子群算法PSO确定最佳开关角对称级联多层逆变器 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 97

RxBus原理分析

RxBus

kai1ge1的博客 772

linux cma alloc fail 问题分析

摘要:日志显示CMA连续内存分配失败(错误码-ENOMEM),请求128页(512KB)内存时因CMA区域不足或内存碎片导致失败。分析发现系统CMA总内存131072KB,空闲65536KB。解决方案包括:1)手动触发内存碎片整理;2)修改设备树或内核配置增大CMA区域(如从16MB增至20MB)。通过调整CONFIG_CMA_SIZE_MBYTES或设备树中的size参数可解决该问题。

陌上花开缓缓归以的博客 798

用RxJava实现RxBus

一.RxBus与RxJava 一次RxJava调用过程可以划分为以下环节: 创建观察内容 (片段1)数据处理/映射(片段2)选择线程(片段3)订阅(片段4,片段5)完成/错误处理(片段6) 示例代码: Observable // 片段1 .create(new Observable.OnSubscribe() {

QQNKW的博客 656

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android主流三方库源码分析:EventBus

最后,我们继续查看注释4处的getMethodsAndRelease()方法:// 1// 2// 3i++) {break;// 4复制代码在这里,首先在注释1处,从findState中取出了保存的subscriberMethods。在注释2处,将findState里的保存的所有对象进行回收。在注释3处,把findState存储在 FindState 池中方便下一次使用,以提高性能。最后,在注释4处,返回subscriberMethods。接着,

2401_84558590的博客 627

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android主流三方库源码分析:EventBus,2024Android常见面试题

光有这些思路和搞懂单个知识的应用是还远远不够的,在Android开源框架设计思想中的知识点还是比较多的,想要搞懂还得学会整理和规划:我们常见的**Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等Android第三方开源框架,**这些都是属于Android开源框架设计思想的。如下图所示:这位阿里P8大佬针对以上知识点,熬夜整理出了一本长达1042页的完整版如何解读开源框架设计思想。

2401_84149814的博客 1181

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android主流三方库源码分析(九、深入理解EventBus源码)

一、EventBus使用流程概念 1、Android事件发布/订阅框架 2、事件传递既可用于Android四大组件间通信 3、EventBus的优点是代码简洁,使用简单,事件发布、订阅充分解耦 4、首先有一个Publisher发射器,将Event通过Post发送到EventBus总线中,根据Event事件类型匹配相应的订阅者Subscriber。 二、源码解析 EventBus.getDefault() 1、使用了双重校验并加锁的单例模式来创建EventBus实例,里面的成员变量通过Ev.

yangjunjin的博客 219

RxJava实现事件总线(RxBus)及详解

RxJava实现事件总线及详解

chen_zhang_yu的博客 3238

2024年Android主流三方库源码分析:EventBus(1),2024年最新h5加载页面素材

最后,我们继续查看注释4处的getMethodsAndRelease()方法:// 1// 2// 3i++) {break;

2401_84520271的博客 401

YCBlogs Jetpack 系列:LiveData 源码级深度解析——从观察者模式到生命周期感知的完整机制

LiveData 是 Android Jetpack Architecture Components 中最重要的可观察数据容器之一,它在传统观察者模式之上增加了生命周期感知能力,使得 Activity、Fragment、Service 等组件只在活跃状态(STARTED/RESUMED)下接收数据通知,并在 DESTROYED 时自动解除订阅,从根本上解决了内存泄漏与后台更新 UI 的崩溃问题。本

gitblog_00298的博客 145

android 闹钟源码分析_Android主流三方库源码分析:EventBus

一、简单示例1、首先,定义要传递的事件实体public class CollectEvent { ... }复制代码2、准备订阅者:声明并注解你的订阅方法@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(CollectEvent event) { LogHelper.d("OK");}复制代码3、在2中,也就...

weixin_42118011的博客 280

Android 使用RxJava实现一个发布/订阅事件总线

1.简单介绍 1.1.发布/订阅事件主要用于网络请求的回调。   事件总线可以使Android各组件之间的通信变得简单,而且可以解耦。   其实RxJava实现事件总线和EventBus比较类似,他们都依据与观察者模式。   个人比较习惯用RxJava来实现,因为非常简单而清晰。    1.2.当然EventBus实现总线的方式也有很多人用。   这里给个...

SFC0511的博客 381

Android中的设计模式之观察者模式

参考 《设计模式:可复用面向对象软件的基础 》5.7 Observer 观察者 对象行为型模式 《设计模式解析》 18.4 Observer模式 《Android源码设计模式解析与实战》第12章 解决,解耦的钥匙--观察者模式 本人能力有限,如有明显错误,不规范的地方,请指正,谢谢。 意图 定义对象间的一种一对多的依赖关系,当一个对象...

weixin_34008805的博客 492
上一篇: 优雅代码养成笔记
下一篇: Data Binding基础学习笔记
vhawk
博客等级 码龄12年 6粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值