RxJava之Subject

探索移动开发中RxJava的Subject类型 本文旨在全面解析RxJava中Subject类型的设计原理和使用方法,帮助移动开发者掌握这一强大工具,提升应用架构的响应式能力。内容涵盖基础概念、核心类型、线程安全及实际应用场景。从观察者模式引出Subject概念详细解析四种主要Subject类型通过实际案例展示应用场景讨论线程安全和使用注意事项提供进阶使用技巧和资源推荐Observable:可观察对象,数据/事件的发射源Observer:观察者,接收并处理数据/事件Subject。 阅读详情

        Subject就像Observable和Observer的契约类,它可以是一个Observable同时也可以是一个Observer:它作为连接它们的一座桥梁。一个Subject可以订阅一个Observable,就像一个观察者,并且它可以发射新的数据,或者传递它接受到的数据,就像一个Observable。很明显,作为一个Observable,观察者们或者其它Subject都可以订阅它。

        RxJava提供四种不同的Subject:PublishSubject、BehaviorSubject、、ReplaySubject.、AsyncSubject。

 PublishSubject

<span style="font-size:14px;">        PublishSubject<String> publishSubject = PublishSubject.create();
        Subscription subscription = publishSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.i("123", "PublishSubject: " + s);
            }
        });</span>
<span style="font-size:14px;">    publishSubject.onNext("Hello RxJava");</span>

       通过上述代码可知,通过PublishSubject.create()方法创建一个PublishSubject对象,订阅了一个Observer对象,但并没有发送数据。此时,没有发送数据,观察者只能等待,没有线程阻塞,没有资源消耗。在调用publishSubject.onNext("Hello RxJava");时,才发送消息。 发送消息结束以后,publishSubject并没有结束,观察者等待消息再一次的发送。如果想关闭publishSubject,publishSubject需调用publishSubject.onCompleted方法关闭。此时,publishSubject再发送消息,观察者不能收到发送的消息。

        Observable关闭对象时,可以调用doOnCompleted()方法关闭,但是此方法对Subject无效,不知道因为啥?

BehaviorSubject

       BehaviorSubject会首先向他的订阅者发送截至订阅前最新的一个数据对象(或初始值),然后正常发送订阅后的数据流。

<span style="font-size:14px;">        BehaviorSubject behaviorSubject = BehaviorSubject.create("First");

        Subscription subscription = behaviorSubject.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                cout++;
                Log.i("123", s + " | " + cout);
            }
        });</span>
<span style="font-size:14px;">        behaviorSubject.onNext("Hello RxJava");</span>
        根据上述代码,在创建BehaviorSubject后,每当Observes订阅它时,它向观察者发送消息即"First",观察者接收到消息并处理“First”消息后,再处于等待状态,等待被观察者下次发送消息。

ReplaySubject

       ReplaySubject会缓存它所订阅的所有数据,向任意一个订阅它的观察者重发。

<span style="font-size:14px;">        ReplaySubject replaySubject = ReplaySubject.create();
        replaySubject.onNext(1);
        replaySubject.onNext(2);
        replaySubject.onNext(3);
        replaySubject.onNext(4);
        replaySubject.onCompleted();
		
		        Observer<Integer> observer_1 = new Observer<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.i("123", "observer_1" + " - " + integer);
            }
        };

        Observer<Integer> observer_2 = new Observer<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.i("123", "observer_2" + " - " + integer);
            }
        };

        replaySubject.subscribe(observer_1);
        replaySubject.subscribe(observer_2);</span>
        分析上述代码,replaySubject创建后,订阅它预发送的消息(1,2,3,4)并执行onCompleted。此时,replaySubject将订阅的消息缓存。若有观察者订阅其时,replaySubject自动将缓存的消息重发。

AsyncSubject

        当Observable完成时AsyncSubject只会发布最后一个数据给已经订阅的每一个观察者。

<span style="font-size:14px;">        AsyncSubject asyncSubject = AsyncSubject.create();
		
		Observer<Integer> observer = new Observer<Integer>() {

            public void onCompleted() {

            }

            public void onError(Throwable e) {

            }

            public void onNext(Integer integer) {
                Log.i("123", "AsyncSubject - observer:" + integer);
            }
        };

        asyncSubject.subscribe(observer);
        asyncSubject.onNext(1);
        asyncSubject.onNext(2);
        asyncSubject.onNext(3);
        asyncSubject.onNext(4);
        asyncSubject.onCompleted();</span>

<span style="font-size:14px;">	// 打印的信息
	**.rxjavademo I/123: AsyncSubject - observer:4AsyncSubject - observer:4</span>
         从打印的消息可以看到,观察者除了收到最后的消息以外,其他的消息并没有接收到。

参考资料

RxJava Essentials

 



GPU加速的容器化AI开发:AnolisOS/CentOS8中的NVIDIA驱动与CUDA最佳实践 本文详细介绍了在AnolisOS/CentOS8系统中配置NVIDIA驱动与CUDA的最佳实践,涵盖驱动安装、CUDA工具链配置、容器运行时设置及性能优化等关键步骤。特别针对容器化AI开发场景,提供了GPU透传和资源管理的实用方案,帮助开发者构建高效的GPU加速开发环境。 阅读详情

相关推荐

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1525

Rxjava之PublishSubject的使用

一、问题引入 此前对rxjava的诸多用法小小的进行过总结,rxjava的使用给代码设计带来了很多惊奇和方便。但是在了解到PublishSubject之后再次被rxjava的简便给折服了。在介绍PublishSubject之前,先容我给出这样一个命题,在Android的开发中,我们经常会在Service中处理批量下载的任务,然后将下载的进度显示在Activity中。如果需要完成Service中数...

polo2044的专栏 1万+

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 135

PublishSubject,ReplaySubject,BehaviorSubject,AsyncSubject

Rx 有两个最基础的类型,和其他一些扩展这两种类型的类。两个核心的类为: Observable 和 Observer。Subject 是同时继承了 Observable 和 Observer。 Rx 是在 Observer 模式之上建立起来的。这种模式很常见,在 Java 中有很多地方都使用了该模式,比如 JavaFx 中的 EventHandler。 这些简单的使用方式和 Rx 对比有如下区别:

7403

Git系列(一)、Git基础教程【建议收藏】

Git一、Git简介1.1、什么是Git? 一、Git简介 1.1、什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不用服务器端软件支持。 .........

一宿君 4万+

告别SquareLine!用免费的NXP GUI-Guider为海思3516AV300开发LVGL界面(附完整移植流程)

本文详细介绍了如何利用免费的NXP GUI-Guider工具为海思Hi3516AV300开发LVGL界面,包括环境配置、代码移植和性能优化等全流程实战指南。特别针对二维码组件缺失等常见问题提供解决方案,帮助开发者零成本构建高效嵌入式GUI系统。

weixin_28292761的博客 415

JAVA深入浅出(一):理解RxJava Subject用法及原理分析

概述 本文将尽可能将RxJava中的Subject相关类的用法做一个阐述,并对其原理进行简单的解析。 说到Subject,很多人可能都不是很熟悉它,因为相对于RxJava的Observable、Schedulers、Subscribes等关键字来讲,它抛头露面的场合似乎很少。 事实上,Subject作用是很大的,借用官方的解释,Subject在同一时间内,既可以作为Observable,也可以作为Observer: 在RxJava2.x中,官方一共为我们提供了以下几种Subject: Replay

Alex 2380

【TI毫米波雷达】IWR6843AOPEVM-G与DCA1000EVM实战:从硬件连接到数据流解析

本文详细解析了TI毫米波雷达开发套件IWR6843AOPEVM-G与DCA1000EVM的硬件连接、模式配置及数据流处理全流程。针对官方手册中的常见配置错误,提供了避坑指南和实测验证的正确设置方法,包括开关配置、网络参数等关键步骤。通过mmWave Studio软件配置雷达参数,并深入解析数据采集与处理流程,帮助开发者高效实现毫米波雷达应用开发。

weixin_30653023的博客 368

PublishSubject、BehaviorSubject 和 ReplaySubject

RxSwift 里面,常见的 Subject 有PublishSubject、BehaviorSubject 和 ReplaySubject。它们的区别在于订阅者能否收到订阅前的事件。 一、PublishSubject 发布事件 订阅者只能接收订阅后的事件,适合发送新的事件 func publishFunc(){ let publishSubject = PublishSubject<Int>() publishSubject.onNext(1) .

Coding_Physical的专栏 1919

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 912

从统一入口到运营中枢:全面看懂 SAP for Me 的能力边界、使用方式与项目价值

SAP for Me 是 SAP 推出的统一工作平台,旨在整合原本分散在多个系统中的关键信息与操作。它将许可证管理、系统状态、支持工单、维护合同、产品路线图等核心功能集中到一个界面,为不同角色提供定制化视图。平台包含多个功能模块:Home 作为个性化工作台展示待办事项与风险;Calendar 整合各类维护事件与关键时间节点;Reporting 提供跨域分析与趋势洞察;Finance & Legal 管理订单、发票与合规事项;Portfolio & Products 则展示产品全景与路线图。该

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 119

RxJava的四种Subjects:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的理解

RxJava的四种Subjects:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的理解 Subject:它既是Observable,又是observer。也就是既可以发送事件,也可以接收事件。 下面是四个子类PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别: PublishSubject<Integer> source = PublishSubject.c

FDoubleman的博客 1537

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RxJava中常见的几种Subject

RxJava 几种常见的Subject PublishSubject、BehaviorSubject、ReplaySubject、AsyncSubject、SerializedSubject

dbs1215的专栏 5246

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

Rxjava分析—Subject

Subject在ReactiveX是作为observer和observerable的一个bridge或者proxy。因为它是一个观察者,所以它可以订阅一个或多个可观察对象,同时因为他是一个可观测对象,所以它可以传递和释放它观测到的数据对象,并且能释放新的对象。 一共有四种为不同用途而设计的Subject,分别为AsyncSubject、BehaviorSubject、PublishSubject。

SUN 1575

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RxJava——Subject详解

Subject是RxJava中的特殊类型,它既是Observer(可以订阅其他Observable),又是Observable(可以被其他Observer订阅)。它作为事件总线或中继器使用。// Subject 继承关系// 核心方法// 支持背压的Flowable版本Observer会接收AsyncSubject的onComplete(之前的最后一个数据如果源Observable没有发射任何值就完成,AsyncSubject也不会发射任何值。

吴声子夜歌的博客 762

RxJava Subject

在Rxjava中,Subject可以同时表示Observer和Observable, 允许从单个源到多个子观察者。除了, 其他方法都是线程安全的,可以使用使它们线程安全。Subject有6个继承类,分别是: 释放接收到的所有数据:释放订阅前最后一个数据和订阅后接收到的所有数据:释放订阅后接收到的数据:仅释放接收到的最后一个数据:串行Subject:仅支持订阅一次的Subject。

qq_40194724的博客 1182

Android RxJava:Subject使用及示例

RxJava的四种Subjects:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的理解 Subject:它既是Observable,又是observer。也就是既可以发送事件,也可以接收事件。 Subject将观察者和被观察者结合为一体,是观察者和被观察者的代理。 下面是四个子类PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别: PublishSubject<I

weixin_42814000的博客 1263

java中subject类_RxJava中常见的几种Subject

RxJava是什么?原文是这样描述的:RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.翻译过来就是一个在 Java VM 上使用可观测的序列来组成...

weixin_33256233的博客 1461

RxJava2-Subject

RxJava2-Subject粗解 文章目录RxJava2-Subject粗解Subject:实现类:实现类Demo:原理解释: Subject: public abstract class Subject<T> extends Observable<T> implements Observer<T> { ... } Subject 可以同时代表 Ob...

相公 411

java subject类的作用_RxJava2 系列-3:使用 Subject

imgtrip-com-2559b11dd61c0946ae8868b27395dcce13569748.jpg在这篇文章中,我们会先分析一下 RxJava2 中的 Subject ;然后,我们会使用 Subject 制作一个类似于 EventBus 的全局的通信工具。在了解本篇文章的内容之前,你需要先了解 RxJava2 中的一些基本的用法,比如 Observable 以及背压的概念,你可以参考...

weixin_29378153的博客 1916

RxJava中关于Subject和Processor的使用

文章目录RxJava的使用步骤Subject&ProcessorSubjectAsyncSubjectBehaviorSubjectPublishSubjectReplaySubject总结 RxJava的使用步骤 RxJava的使用需要三步: 创建Observable: Observable是被观察者,负责在上游发送事件,可以在这里决定异步操作模块的次数和顺序。 创建Observer: Observer是观察者,负责接收上游发送的事件。Observer可以自由切换线程,简化了并发操作,会在未来某

小马快跑的博客 817

RxJava 常见误区(一):过度使用 Subject

本文首发:http://prototypez.github.io/2016/04/10/rxjava-common-mistakes-1/ 转载请注明出处 准备写这篇文章的时候看了下 RxJava 在 Github 上已经 12000+ 个 star 了,可见火爆程度,自己使用 RxJava 也已经有一小段时间。最初是在社区对 RxJava 一片赞扬之声下,开始使用 RxJava 来代替项

PrototypeZ的博客 7742

Rxjava Subject分析

Subject = Observable + Observer看看官方的描述: Subject可以看成是一个桥梁或者代理,在某些ReactiveX实现中(如RxJava),它同时充当了Observer和Observable的角色。因为它是一个Observer,它可以订阅一个或多个Observable;又因为它是一个Observable,它可以转发它收到(Observe)的数据,也可以发射新的数据

Dream It Possible 1万+

Android--Rxjava分析—Subject

Rxjava分析—Subject 分类:JavaAndroid  (2749)  (2) Subject在ReactiveX是作为observer和observerable的一个bridge或者proxy。因为它是一个观察者,所以它可以订阅一个或多个可观察对象,同时因为他是一个可观测对象,所以它可以传递和释放它观测到的数据对象,并且能释放新的对象。

Navan 1001
上一篇: RxJava-简介及Observable创建
下一篇: RxJava之过滤操作符
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值