RxJava Subject

目录

  • AsyncSubject
  • BehaviorSubject
  • PublishSubject
  • ReplaySubject
  • SerializedSubject
  • UnicastSubject

在Rxjava中, Subject可以同时表示ObserverObservable, 允许从单个源到多个子观察者multiple child Observers
除了 onSubscribe(io.reactivex.disposables.Disposable), onNext(Object), onError(Throwable) and onComplete(), 其他方法都是线程安全的,可以使用toSerialized()使它们线程安全。

Subject有6个继承类,分别是
ReplaySubject : 释放接收到的所有数据
BehaviorSubject :释放订阅前最后一个数据和订阅后接收到的所有数据
PublishSubject :释放订阅后接收到的数据
AsyncSubject :仅释放接收到的最后一个数据
SerializedSubject:串行Subject
UnicastSubject :仅支持订阅一次的Subject

AsyncSubject

AsyncSubject仅发送Observable释放的最后一个数据,并且仅在Observable完成之后。然而如果当Observable因为异常而终止,AsyncSubject将不会发送任何数据,但是会向Observer传递一个异常通知。

A Subject that emits the very last value followed by a completion event or the received error to Observers.

    public static void asyncSubject() {
        asyncSubject.onNext(1);
        asyncSubject.onNext(2);
        asyncSubject.onComplete();
        asyncSubject.onNext(3);
        asyncSubject.subscribe(
                integer -> {out.println("number is " + integer);},
                throwable -> {out.println("error");}
        );
    }
// onComplete之后发送的数据无效,只有在onComplete之后才会发送最后一个数据· 
// 如果不发送onComplete事件也不会释放最后一个数据。
// output number is 2
// 如果因为异常而终止,不会发送任何数据,只会传递onError事件

在这里插入图片描述

BehaviorSubject

BehaviorSubject发送订阅之前的最后一个数据和订阅之后的所有数据。如果Observable因异常终止,BehaviorSubject将不会向后续的Observer发送数据,但是会向Observer传递一个异常通知。

Subject that emits the most recent item it has observed and all subsequent observed items to each subscribed Observer

  // observer will receive all 4 events (including "default").
  BehaviorSubject<Object> subject = BehaviorSubject.createDefault("default");
  subject.subscribe(observer);
  subject.onNext("one");
  subject.onNext("two");
  subject.onNext("three");

  // observer will receive the "one", "two" and "three" events, but not "zero"
  BehaviorSubject<Object> subject = BehaviorSubject.create();
  subject.onNext("zero");
  subject.onNext("one");
  subject.subscribe(observer);
  subject.onNext("two");
  subject.onNext("three");

  // observer will receive only onComplete
  BehaviorSubject<Object> subject = BehaviorSubject.create();
  subject.onNext("zero");
  subject.onNext("one");
  subject.onComplete();
  subject.subscribe(observer);

  // observer will receive only onError
  BehaviorSubject<Object> subject = BehaviorSubject.create();
  subject.onNext("zero");
  subject.onNext("one");
  subject.onError(new RuntimeException("error"));
  subject.subscribe(observer);
  }

在这里插入图片描述

PublishSubject

PublishSubject仅会向Observer发送在订阅之后Observable释放的数据。

A Subject that emits (multicasts) items to currently subscribed Observers and terminal events to current or late Observers.

  PublishSubject<Object> subject = PublishSubject.create();
  // observer1 will receive all onNext and onComplete events
  subject.subscribe(observer1);
  subject.onNext("one");
  subject.onNext("two");
  // observer2 will only receive "three" and onComplete
  subject.subscribe(observer2);
  subject.onNext("three");
  subject.onComplete();

在这里插入图片描述

ReplaySubject

该Subject会接收数据,当被订阅时,将所有接收到的数据全部发送给订阅者。

Replays events (in a configurable bounded or unbounded manner) to current and late Observers.
This subject does not have a public constructor by design; a new empty instance of this ReplaySubject can be created via the following create methods that allow specifying the retention policy for items:

  ReplaySubject<Object> subject = ReplaySubject.create();
  subject.onNext("one");
  subject.onNext("two");
  subject.onNext("three");
  subject.onComplete();

  // both of the following will get the onNext/onComplete calls from above
  subject.subscribe(observer1);
  subject.subscribe(observer2);

在这里插入图片描述

SerializedSubject

调用Subject的toSerialized保证观察者和被观察者的数据安全。主要是加锁

    /**
     * Wraps this Subject and serializes the calls to the onSubscribe, onNext, onError and
     * onComplete methods, making them thread-safe.
     * <p>The method is thread-safe.
     * @return the wrapped and serialized subject
     */
    @NonNull
    public final Subject<T> toSerialized() {
        if (this instanceof SerializedSubject) {
            return this;
        }
        return new SerializedSubject<T>(this);
    }

UnicastSubject

仅支持订阅一次的Subject,如果多个订阅者试图订阅这个Subject,若该subjectterminate,将会受到IllegalStateException ,若已经terminate,那么只会执行onError或者onComplete方法。

A Subject that queues up events until a single Observer subscribes to it, replays those events to it until the Observer catches up and then switches to relaying events live to this single Observer until this UnicastSubject terminates or the Observer unsubscribes.

 unicastSubject.onNext(1);
 unicastSubject.onNext(2);
 unicastSubject.onComplete();
 unicastSubject.onNext(3);
 unicastSubject.subscribe(
         integer -> {out.println("number is " + integer);},
         throwable -> {out.println("error");}
 );
 unicastSubject.subscribe(
         integer -> {out.println("number is " + integer);},
         throwable -> {out.println("error");}
 );
        
number is 1
number is 2
error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

使用easyExcel 定义表头 字体 格式 颜色等,定义表内容,合计

HeadStyle 表头样式注解 HeadFontStyle 表头字体样式 HeadStyle(fillPatternType FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor 22) HeadFontStyle(fontHeightInPoints 12) 以下为实现效果

PostgreSql与Postgis安装

POstgresql安装 1.登录官网 PostgreSQL: Linux downloads (Red Hat family) 2.选择版本 3.安装 ### 源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm ### 客户端 yum install postgresql14 ###…

vue 实现一个持续时间定时器组件

vue 实现一个定时器组件 效果图子组件父组件 效果图 子组件 新建一个timer.vue文件 <template><span :class"{red: string > 600}">{{ string | formatDurationS }}</span> </template> <script>export default {name: timer,pro…

详细分析python中的from waitress import serve(附Demo)

目录 前言1. 基本知识2. serve源码分析3. 基本操作 前言 以前玩python 开发的时候写过一些见解&#xff0c;推荐阅读&#xff1a; uwsgi启动django以及uwsgi.ini的配置参数详解Django框架零基础入门 部署服务器除了Flask还有serve 在讲述serve之前&#xff0c;先讲述两者的…

[大厂实践] Netflix容器平台内核panic可观察性实践

在某些情况下&#xff0c;K8S节点和Pod会因为出错自动消失&#xff0c;很难追溯原因&#xff0c;其中一种情况就是发生了内核panic。本文介绍了Netflix容器平台针对内核panic所做的可观测性增强&#xff0c;使得发生内核panic的时候&#xff0c;能够导出信息&#xff0c;帮助排…

基于SpringBoot3的快速迭代平台

SpringBoot3的快速开发平台 前言一、技术栈二、项目结构三、总结 前言 MateBoot是一个基于SpringBoot3的快速开发平台&#xff0c;采用前后端分离的模式&#xff0c;前端采用Element Plus组件&#xff0c;后端采用SpringBoot3、Sa-token、Mybatis-Plus、Redis、RabbitMQ、Fast…

大模型为什么会有 tokens 限制?

人是以字数来计算文本长度&#xff0c;大语言模型 &#xff08;LLM&#xff09;是以 token 数来计算长度的。LLM 使用 token 把一个句子分解成若干部分。 token 可以是一个单词、一个单词中的一个部分、甚至是一个字符&#xff0c;具体取决于它使用的标记化方法 (tokenization…

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第四章时&#xff0c;笔者使用了Odin插件&#xff0c;对Item和ItemDatabase的SO文件进行了一些优化&#xff0c;使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动&#xff0c;整体代码量减少…

AI-数学-高中-23-三角函数的平移与伸缩

原作者视频&#xff1a;三角函数】11三角函数的平移伸缩&#xff08;易&#xff09;_哔哩哔哩_bilibili 左加右减&#xff1a;针对函数中的x变化&#xff0c;上加下减&#xff1a;针对函数f(x)变化。 示例1&#xff1a; 示例2&#xff1a; 示例3

实现远程开机(电脑)的各种方法总结

一.为什么要远程开机 因为工作需要&#xff0c;总是需要打开某台不在身边的电脑&#xff0c;相信很多值友也遇到过相同的问题&#xff0c;出门在外&#xff0c;或者在公司&#xff0c;突然需要的一个文件存在家里的电脑上&#xff0c;如果家里有人可以打个电话回家&#xff0c…

响应式设计的基本原理和实现方法(超级详细)

目录 一、是什么二、实现方式媒体查询百分比vw/vhrem小结 三、总结参考文献 一、是什么 响应式网站设计&#xff08;Responsive Web design&#xff09;是一种网络页面设计布局&#xff0c;页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行…

【状态管理一】概览:状态使用、状态分类、状态具体使用

文章目录 一. 状态使用概览二. 状态的数据类型1. 算子层面2. 接口层面2.1. UML与所有状态类型介绍2.2. 内部状态&#xff1a;InternalKvState 将知识与实际的应用场景、设计背景关联起来&#xff0c;这是学以致用、刨根问底知识的一种直接方式。 本文介绍 状态数据管理&#x…

【Linux系统学习】3.Linux用户和权限

Linux用户和权限 1.认知root用户 1.1 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; 而在前期&#…

海外云手机的核心优势

随着5G时代的到来&#xff0c;云计算产业正处于高速发展的时期&#xff0c;为海外云手机的问世创造了一个可信任的背景。在资源有限且需求不断增加的时代&#xff0c;将硬件设备集中在云端&#xff0c;降低个人用户的硬件消耗&#xff0c;同时提升性能&#xff0c;这一点单单就…

Vue3中路由配置Catch all routes (“*“) must .....问题

Vue3中路由配置Catch all routes (“*”) must …问题 文章目录 Vue3中路由配置Catch all routes ("*") must .....问题1. 业务场景描述1. 加载并添加异步路由场景2. vue2中加载并添加异步路由(OK)3. 转vue3后不好使(Error)1. 代码2. 错误 2. 处理方式1. 修改前2. 修…

分布式存储中常见的容错机制:多副本、纠删码(RS、LRC、SHEC)

文章目录 分布式存储中常见的容错机制浴缸原理多副本纠删码RSLRCSHEC 总结 分布式存储中常见的容错机制 浴缸原理 在存储领域中&#xff0c;通常我们会使用浴缸曲线来描述硬盘的故障率&#xff0c;如下图。 浴缸曲线 故障率随着时间变化&#xff0c;主要分为三个阶段&#x…

设计模式2-对象池模式

对象池模式&#xff0c;Object Pool Pattern&#xff0c;当你的应用程序需要频繁创建和销毁某种资源&#xff08;比如数据库连接、线程、socket连接等&#xff09;时&#xff0c;Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中&#xff0c;以便在…

数据结构——单链表详解

目录 前言 一.什么是链表 1.概念 ​编辑 2.分类 二.单链表的实现(不带头单向不循环链表) 2.1初始化 2.2打印 2.3创建新节点 2.4头插、尾插 2.5头删、尾删 2.6查找 2.7在指定位置之前插入 2.8在指定位置之后插入 2.9删除pos位置 2.10删除pos之后的 2.11销毁链表…

相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…