RxJava2 系列-3:Subject 及其几种应用方式

MinIO在Windows环境下的完整配置流程:端口修改+密码安全+外网访问一步到位 本文详细介绍了在Windows环境下配置MinIO的完整流程,包括端口修改、密码安全强化和外网访问设置。通过步骤详解和实用建议,帮助用户实现安全、高效的MinIO部署,特别适合需要团队协作或对外服务的场景。 阅读详情

在这篇文章中,我们会先分析一下 RxJava2 中的 Subject ;然后,我们会使用 Subject 制作一个类似于 EventBus 的全局的通信工具。

在了解本篇文章的内容之前,你需要先了解 RxJava2 中的一些基本的用法,比如 Observable 以及背压的概念,你可以参考我的其他两篇文章来获取这部分内容:《RxJava2 系列 (1):一篇的比较全面的 RxJava2 方法总结》和《RxJava2 系列 (2):背压和Flowable》。

1、Subject

1.1 Subject 的两个特性

Subject 可以同时代表 Observer 和 Observable,允许从数据源中多次发送结果给多个观察者。除了 onSubscribe(), onNext(), onError() 和 onComplete() 之外,所有的方法都是线程安全的。此外,你还可以使用 toSerialized() 方法,也就是转换成串行的,将这些方法设置成线程安全的。

如果你已经了解了 Observable 和 Observer ,那么也许直接看 Subject 的源码定义会更容易理解:

public abstract class Subject<T> extends Observable<T> implements Observer<T> {

    // ...
}

从上面看出,Subject 同时继承了 Observable 和 Observer 两个接口,说明它既是被观察的对象,同时又是观察对象,也就是可以生产、可以消费、也可以自己生产自己消费。所以,我们可以项下面这样来使用它。这里我们用到的是该接口的一个实现 PublishSubject :

public static void main(String...args) {
    PublishSubject<Integer> subject = PublishSubject.create();
    subject.subscribe(System.out::println);

    Executor executor = Executors.newFixedThreadPool(5);
    Disposable disposable = Observable.range(1, 5).subscribe(i ->
            executor.execute(() -> {
                try {
                    Thread.sleep(i * 200);
                    subject.onNext(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }));
}

根据程序的执行结果,程序在第200, 400, 600, 800, 1000毫秒依次输出了1到5的数字。

在这里,我们用 PublishSubject 创建了一个主题并对其监听,然后在线程当中又通知该主题内容变化,整个过程我们都只操作了 PublishSubject 一个对象。显然,使用 Subject 我们可以达到对一个指定类型的值的结果进行监听的目的——我们把值改变之后对应的逻辑写在 subscribe() 方法中,然后每次调用 onNext() 等方法通知结果之后就可以自动调用 subscribe() 方法进行更新操作。

同时,因为 Subject 实现了 Observer 接口,并且在 Observable 等的 subscribe() 方法中存在一个以 Observer 作为参数的方法(如下),所以,Subject 也是可以作为消费者来对事件进行消费的。

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

以上就是 Subject 的两个主要的特性。

1.2 Subject 的实现类

在 RxJava2 ,Subject 有几个默认的实现,下面我们对它们之间的区别做简单的说明:

  1. AsyncSubject:只有当 Subject 调用 onComplete 方法时,才会将 Subject 中的最后一个事件传递给所有的 Observer。比如,在下面的例子中,虽然在发送 “two” 的时候,observer 就进行了订阅,但是只有当 subject 调用了 onComplete() 方法的时候,observer 才收到了 “three” 这一个事件:

     AsyncSubject<String> subject = AsyncSubject.create();
     subject.onNext("one");
     subject.onNext("two");
     subject.subscribe(observer);
     subject.onNext("three");
     subject.onComplete();
    
  2. BehaviorSubject:在创建 BehaviorSuject 的时候可以通过静态的工厂方法指定一个默认值数,也可以不指定。当一个 Observer 使用了 subscribe() 方法对其进行订阅的时候,它只能收到在订阅之前发送出的最后一个结果(或者说最新的值),在这之前的结果是无法被接收到的。比如,下面的例子中,新注册的 observer 只能接收到 “one”, “two” 和 “three”,但是无法接收到 “zero”:

     BehaviorSubject<Object> subject = BehaviorSubject.create();
     subject.onNext("zero");
     subject.onNext("one");
     subject.subscribe(observer);
     subject.onNext("two");
     subject.onNext("three");
    
  3. PublishSubject:不会改变事件的发送顺序;在已经发送了一部分事件之后注册的 Observer 不会收到之前发送的事件。比如,在下面的代码中,observer1 会收到所有的 onNext() 和 onComplete() 发出的结果,但是 observer2 只能收到 “three” 和最终的 onComplete():

     PublishSubject<Object> subject = PublishSubject.create();
     // observer1 进行订阅
     subject.subscribe(observer1);
     subject.onNext("one");
     subject.onNext("two");
     // observer2 进行订阅
     subject.subscribe(observer2);
     subject.onNext("three");
     subject.onComplete();
    
  4. ReplaySubject:无论什么时候注册 Observer 都可以接收到任何时候通过该 Observable 发射的事件。比如,在下面的代码中,observer1 和 observer2 可以收到在它们进行订阅之前的所有的 onNext() 和 onCompete() 事件:

     ReplaySubject<Object> subject = ReplaySubject.create();
     subject.onNext("one");
     subject.onNext("two");
     subject.onNext("three");
     subject.onComplete();
     // observer1 和 observer2 进行订阅
     subject.subscribe(observer1);
     subject.subscribe(observer2);
    
  5. UnicastSubject:只允许一个 Observer 进行监听,在该 Observer 注册之前会将发射的所有的事件放进一个队列中,并在 Observer 注册的时候一起通知给它。比如,在下面的例子中,当 observer1 进行订阅的时候,会将 “one” “two” “three” 依次发送给 observer1,而当 observer2 进行订阅的时候会抛出一个异常,因为只能有一个观察者可以订阅:

     UnicastSubject<String> subject = UnicastSubject.create();
     subject.onNext("one");
     subject.onNext("two");
     subject.onNext("three");
     subject.subscribe(observer1);
     subject.subscribe(observer2);
    

对比 PublishSubject 和 ReplaySubject,它们的区别在于新注册的 Observer 是否能够收到在它注册之前发送的事件。这个类似于 EventBus 中的 StickyEvent 即黏性事件,为了说明这一点,我们准备了下面两段代码:

private static void testPublishSubject() throws InterruptedException {
    PublishSubject<Integer> subject = PublishSubject.create();
    subject.subscribe(i -> System.out.print("(1: " + i + ") "));

    Executor executor = Executors.newFixedThreadPool(5);
    Disposable disposable = Observable.range(1, 5).subscribe(i -> executor.execute(() -> {
        try {
            Thread.sleep(i * 200);
            subject.onNext(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }));

    Thread.sleep(500);
    subject.subscribe(i -> System.out.print("(2: " + i + ") "));

    Observable.timer(2, TimeUnit.SECONDS).subscribe(i -> ((ExecutorService) executor).shutdown());
}

private static void testReplaySubject() throws InterruptedException {
    ReplaySubject<Integer> subject = ReplaySubject.create();
    subject.subscribe(i -> System.out.print("(1: " + i + ") "));

    Executor executor = Executors.newFixedThreadPool(5);
    Disposable disposable = Observable.range(1, 5).subscribe(i -> executor.execute(() -> {
        try {
            Thread.sleep(i * 200);
            subject.onNext(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }));

    Thread.sleep(500);
    subject.subscribe(i -> System.out.print("(2: " + i + ") "));

    Observable.timer(2, TimeUnit.SECONDS).subscribe(i -> ((ExecutorService) executor).shutdown());
}

它们的输出结果依次是

PublishSubject的结果:(1: 1) (1: 2) (1: 3) (2: 3) (1: 4) (2: 4) (1: 5) (2: 5)
ReplaySubject的结果: (1: 1) (1: 2) (2: 1) (2: 2) (1: 3) (2: 3) (1: 4) (2: 4) (1: 5) (2: 5)

从上面的结果对比中,我们可以看出前者与后者的区别在于新注册的 Observer 并没有收到在它注册之前发送的事件。试验的结果与上面的叙述是一致的。

其他的测试代码这不一并给出了,详细的代码可以参考Github - Java Advanced。

2、用 RxJava 打造 EventBus

2.1 打造 EventBus

清楚了 Subject 的概念之后,让我们来做一个实践——用 RxJava 打造 EventBus。

我们先考虑用一个全局的 PublishSubject 来解决这个问题,当然,这意味着我们发送的事件不是黏性事件。不过,没关系,只要这种实现方式搞懂了,用 ReplaySubject 做一个发送黏性事件的 EventBus 也非难事。

考虑一下,如果要实现这个功能我们需要做哪些准备:

  1. 我们需要发送事件并能够正确地接收到事件。 要实现这个目的并不难,因为 Subject 本身就具有发送和接收两个能力,作为全局的之后就具有了全局的注册和通知的能力。因此,不论你在什么位置发送了事件,任何订阅的地方都能收到该事件。
  2. 首先,我们要在合适的位置对事件进行监听,并在合适的位置取消事件的监听。如果我们没有在适当的时机释放事件,会不会造成内存泄漏呢?这还是有可能的。 所以,我们需要对注册监听的观察者进行记录,并提供注册和取消注册的方法,给它们在指定的生命周期中进行调用。

好了,首先是全局的 Subject 的问题,我们可以实现一个静态的或者单例的 Subject。这里我们选择使用后者,所以,我们需要一个单例的方式来使用 Subject:

public class RxBus {

private static volatile RxBus rxBus;

private final Subject<Object> subject = PublishSubject.create().toSerialized();

public static RxBus getRxBus() {
    if (rxBus == null) {
        synchronized (RxBus.class) {
            if(rxBus == null) {
                rxBus = new RxBus();
            }
        }
    }
    return rxBus;
}

}

这里我们应用了 DCL 的单例模式提供一个单例的 RxBus,对应一个唯一的 Subject. 这里我们用到了 Subject 的toSerialized(),我们上面已经提到过它的作用,就是用来保证 onNext() 等方法的线程安全性。

另外,因为 Observalbe 本身是不支持背压的,所以,我们还需要将该 Observable 转换成 Flowable 来实现背压的效果:

public <T> Flowable<T> getObservable(Class<T> type){
    return subject.toFlowable(BackpressureStrategy.BUFFER).ofType(type);
}

这里我们用到的背压的策略是BackpressureStrategy.BUFFER,它会缓存发射结果,直到有消费者订阅了它。而这里的ofType()方法的作用是用来过滤发射的事件的类型,只有指定类型的事件会被发布。

然后,我们需要记录订阅者的信息以便在适当的时机取消订阅,这里我们用一个Map<String, CompositeDisposable>类型的哈希表来解决。这里的CompositeDisposable用来存储 Disposable,从而达到一个订阅者对应多个 Disposable 的目的。CompositeDisposable是一个 Disposable 的容器,声称可以达到 O(1) 的增、删的复杂度。这里的做法目的是使用注册观察之后的 Disposable 的 dispose() 方法来取消订阅。所以,我们可以得到下面的这段代码:

public void addSubscription(Object o, Disposable disposable) {
    String key = String.valueOf(o.hashCode());
    if (disposableMap.get(key) != null) {
        disposableMap.get(key).add(disposable);
    } else {
        CompositeDisposable disposables = new CompositeDisposable();
        disposables.add(disposable);
        disposableMap.put(key, disposables);
    }
}

public void unSubscribe(Object o) {
    String key = String.valueOf(o.hashCode());
    if (!disposableMap.containsKey(key)){
        return;
    }
    if (disposableMap.get(key) != null) {
        disposableMap.get(key).dispose();
    }

    disposableMap.remove(key);
}

最后,对外提供一下 Subject 的订阅和发布方法,整个 EventBus 就制作完成了:

public void post(Object o){
    subject.onNext(o);
}

public <T> Disposable doSubscribe(Class<T> type, Consumer<T> next, Consumer<Throwable> error){
    return getObservable(type)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(next,error);
}

2.2 测试效果

我们只需要在最顶层的 Activity 基类中加入如下的代码。这样,我们就不需要在各个 Activity 中取消注册了。然后,就可以使用这些顶层的方法来进行操作了。

protected void postEvent(Object object) {
    RxBus.getRxBus().post(object);
}

protected <M> void addSubscription(Class<M> eventType, Consumer<M> action) {
    Disposable disposable = RxBus.getRxBus().doSubscribe(eventType, action, LogUtils::d);
    RxBus.getRxBus().addSubscription(this, disposable);
}

protected <M> void addSubscription(Class<M> eventType, Consumer<M> action, Consumer<Throwable> error) {
    Disposable disposable = RxBus.getRxBus().doSubscribe(eventType, action, error);
    RxBus.getRxBus().addSubscription(this, disposable);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    RxBus.getRxBus().unSubscribe(this);
}

在第一个 Activity 中我们对指定的类型的结果进行监听:

addSubscription(RxMessage.class, rxMessage -> ToastUtils.makeToast(rxMessage.message));

然后,我们在另一个 Activity 中发布事件:

postEvent(new RxMessage("Hello world!"));

这样当第二个 Activity 中调用指定的发送事件的方法之后,第一个 Activity 就可以接收到发射的事件了。

总结

好了,以上就是 Subject 的使用,如果要用一个词来形容它的话,那么只能是“自给自足”了。就是说,它同时做了 Observable 和 Observer 的工作,既可以发射事件又可以对事件进行消费,可谓身兼数职。它在那种想要对某个值进行监听并处理的情形特别有用。因为它不需要你写多个冗余的类,只要它一个就完成了其他两个类来完成的任务,因而代码更加简洁。

2018年10月26日修正

更正 RxBus 中的 addSubscription() 和 unSubscribe() 两个方法,在之前的版本中使用传入的 Object 的类名作为哈希表的键,现改为使用 Object 的哈希码作为哈希表的键:使用类名的时候存在一个问题,即如果在 Fragment 中使用 RxBus,并且同一类型的 Fragment 在多个地方使用,会导致其中一个 Fragment 取消订阅的时候,所有同一类型的 Fragment 都取消订阅。

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

相关推荐

单细胞分析实录(12): 如何推断肿瘤细胞

公众号后台回复20210418,获取本文的测试数据 1. 回顾 前面我已经讲解了inferCNV的基本用法,这一节继续学习:如何推断肿瘤细胞。本文应该是到目前为止,全网最详细的帖子(之一)。 关于肿瘤细胞的推断,比如研究上皮细胞起源的肿瘤,我见过的一些做法如下 简单粗暴型:将来源肿瘤病灶的所有上皮细胞都看成是肿瘤细胞 看CNV:将来源于肿瘤病灶的上皮细胞和参考细胞比较,将那些有明显CNV的细胞看作肿瘤细胞 看表达特征:考虑到有的肿瘤细胞可能没有CNV层面的变化,有的文章会根据肿瘤与正常的表达谱来区分是.

TOP生物信息 1万+

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

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

weixin_29378153的博客 1916

zynq-7000学习笔记(八)——USB摄像头图像采集

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:Zed Board USB摄像头:罗技 C270(720P) linux源码:2016_R1 一、配置linux,支持UVC       如果是中星微的ZC3XX系列的芯片,则要进到GSPCA把ZC3XX的驱动选上

luotong86的专栏 1万+

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

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

Alex 2380

【智能优化算法】2024年SCI鳗鱼-石斑鱼优化算法(EGO),含MathType公式、word伪代码、visio流程图、matlab代码等。

该文中包括5个内容:用MathType编辑的公式、伪代码、visio的流程图,matlab代码,PDF论文,拿来直接用,可以帮助科研者省下超多时间。 鳗鱼-石斑鱼优化算法(Eel and grouper optimizer ,EGO)是一种新型的元启发式算法(智能优化算法),灵感来源于海洋生态系统中鳗鱼和石斑鱼的共生作用和觅食策略。该成果由Ali Mohammadzadeh和Seyedali Mirjalili两位作者于2024年6月发表在SCI著名期刊《Cluster Computing》上。

2301_79359347的博客 1040

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3210

RxJava 3.x

3.ReplaySubject不管Observer何时订阅ReplaySubject,ReplaySubject均会发射所有来自原始Observable的数据给Observer。Subject 既可以是一个 Observer 也可以是一个Observerable,它是连接 Observer 和Observerable的桥梁。RxJava的异步操作是通过扩展的观察者模式来实现的,RxJava有4个角色Observable、Observer、Subscriber、Suject。•onNext:普通的事件。

LZW_00007的博客 284

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1284

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

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上,如果试着使用C语言制作微型计算机的控制程序等,就必须使用与“普通的C程序”不同的使用方法。 作为一般的C语言的学习方法,使用“printf”“scanf”等标准函数的程序开发是固定的,但这些都是以UNIX和Windows等环境上的应用程序开发为前提的。 对此,没有显示器和键盘的嵌入式系统的微型计算机控制程序,该如何

编程老王 7975

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

当前,传统的养老院出入管理模式普遍存在信息更新滞后、数据统计繁琐、实时监控能力不足等问题,难以满足现代养老机构对安全管理与服务质量提升的需求。本系统设计正是针对这些问题,通过集成先进的硬件设备如高性能GEC6818开发板以及RFID刷卡模块,结合稳定高效的嵌入式Linux操作系统和QT开发框架,构建一套功能齐全、操作直观、响应迅速的智能出入管理系统。 该系统能自动记录并实时显示老人的进出时间,方便管理人员及时了解每位老人的活动轨迹,同时具备强大的后台管理功能,支持管理员便捷地进行老人信息的增删改查操作。通

1068

RxJava之Subject

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

行云间 2540

[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记

最近开始学习网络安全相关知识,接触了好多新术语,感觉自己要学习的东西太多,真是学无止境,也发现了好几个默默无闻写着博客、做着开源的大神。接下来系统分享一些网络安全的自学笔记,希望读者们喜欢。 上一篇文章分享了看雪Web安全总结知识和一个异或解密的示例,本篇文章着重讲解Chrome浏览器保留密码功能渗透解析及登录加密入门笔记,结合实际例子一步步实现浏览器漏洞的挖掘。非常基础的文章,希望对入门的博友们有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 2万+

RxJava2-Subject

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

相公 411

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RxJava Subject

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

qq_40194724的博客 1182

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android RxJava:Subject使用及示例

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

weixin_42814000的博客 1263

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Rxjava分析—Subject

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

SUN 1575

Android RxJava2.0:4种Subject

4种Subject 分别为:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject Subject将观察者和被观察者结合为一体,是观察者和被观察者的代理。 (1)AsyncSubject AsyncSubject asyncSubject = AsyncSubject.create(); asyncSubject.onNext("A"); asyncSubject.onNext("B"); asyncSubject.

weixin_42814000的博客 1384

RxJava系列(3):用RxJava打造EventBus

RxJava2 系列 (2):背压和Flowable背压(Back Pressure)的概念最初并不是在响应式编程中提出的,它最初RxJava2 系列 (3):使用 Subject在这篇文章中,我们会先分析一下 RxJava2 中的 Subject ;然后,我

夜游神 597

RxJava——Subject详解

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

吴声子夜歌的博客 762

【Android RxJava】Observal与Subject深入理解

Rxjava Observal Subject的理解

studyForMokey的博客 1139

RxJava中关于Subject和Processor的使用

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

小马快跑的博客 817

Android--Rxjava分析—Subject

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

Navan 1001

Rxjava2.0中的 Subject

Rxjava Subject 目录 与Rxjava1.0相比 继承关系 doc解释 8种Subject Subject作为观察者使用 总结 与Rxjava1.0相比 其实2.0变化并不大,本质上没什么变化,只是使用方式上传入的参数有所改变,大家都知道2.0使用Consumer取代了Action1-9(保留了Action,但是回调方法名字也改了)

3385

Rxjava2 介绍与详解实例

Rxjava介绍

JiangMing-JIM的博客 1369
上一篇: RxJava2 系列-2:背压和 Flowable
下一篇: Android 架构设计:MVC、MVP、MVVM和组件化
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值