RxJava之PublishSubject、BehaviorSubject、ReplaySubject和AsyncSubject


public class T2 {/*** subject 是一个神奇的对象,它可以是一个Observable同时也可以是一个Observer:它作为连接这两个世界的一座桥梁。* 一个主题可以订阅一个Observable,就像一个观察者,并且它可以发射新的数据,或者传递它接受到的数据,就像一个Observable。* 很明显,作为一个Observable,观察者们或者其它主题都可以订阅它。* 串行化如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),* 这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。* 要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject ,类似于这样:* mySafeSubject = new SerializedSubject( myUnsafeSubject );*/public static void main(String[] args) {T2 t2 = new T2();System.out.println("===================testPublishSubject==========================");t2.testPublishSubject();System.out.println("===================testBehaviorSubject==========================");t2.testBehaviorSubject();System.out.println("===================testReplaySubject==========================");t2.testReplaySubject();System.out.println("===================testAsyncSubject==========================");t2.testAsyncSubject();}/*PublishSubject的观察者接收到的是后续的消息输出为:===================testPublishSubject==========================observer1 - A	observer1 - B	observer1 - C	observer2 - C	observer1 - D	observer2 - D	onCompletedonCompleted* */private void testPublishSubject() {Observer<String> observer1 = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print("observer1 - " + t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};Observer<String> observer2 = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print("observer2 - " + t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};PublishSubject<String> publishSubject = PublishSubject.create();publishSubject.subscribe(observer1);publishSubject.onNext("A");publishSubject.onNext("B");publishSubject.subscribe(observer2);publishSubject.onNext("C");publishSubject.onNext("D");publishSubject.onCompleted();System.out.println();}/** BehaviorSubject的观察者接收到的永远是最近的消息 和后续的消息* 输出为===================testBehaviorSubject==========================* default	A	B	C* B	C	D* onCompleted* error* */private void testBehaviorSubject() {Observer<String> observer = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print(t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};//收到所有消息BehaviorSubject<String> subject1 = BehaviorSubject.create("default");subject1.subscribe(observer);subject1.onNext("A");subject1.onNext("B");subject1.onNext("C");System.out.println();//不能收到default、ABehaviorSubject<String> subject2 = BehaviorSubject.create("default");subject2.onNext("A");subject2.onNext("B");subject2.subscribe(observer);subject2.onNext("C");subject2.onNext("D");System.out.println();//只能收到onCompletedBehaviorSubject<String> subject3 = BehaviorSubject.create("default");subject3.onNext("A");subject3.onNext("B");subject3.onCompleted();subject3.subscribe(observer);System.out.println();// 只能收到errorBehaviorSubject<String> subject4 = BehaviorSubject.create("default");subject4.onNext("A");subject3.onNext("B");subject4.onError(new RuntimeException("error"));subject4.subscribe(observer);System.out.println();}/** ReplaySubject会缓存所有消息,所以观察者都会收到所有消息* 输出:===================testReplaySubject==========================* A	B	A	B	C	C	D	D	onCompleted* onCompleted* */private void testReplaySubject() {Observer<String> observer1 = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print(t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};Observer<String> observer2 = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print(t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};ReplaySubject<String> publishSubject = ReplaySubject.create();publishSubject.subscribe(observer1);publishSubject.onNext("A");publishSubject.onNext("B");publishSubject.subscribe(observer2);publishSubject.onNext("C");publishSubject.onNext("D");publishSubject.onCompleted();System.out.println();}/**当Observable完成时AsyncSubject只会发布最后一条消息给已经订阅的每一个观察者,* 如果没有调用onCompleted则被观察者不会发送任何消息给观察者* 输出===================testAsyncSubject==========================* C	onCompleted* */private void testAsyncSubject() {Observer<String> observer = new Observer<String>() {@Overridepublic void onNext(String t) {System.out.print(t + "\t");}@Overridepublic void onCompleted() {System.out.println("onCompleted");}@Overridepublic void onError(Throwable e) {System.out.println(e.getMessage());}};AsyncSubject<String> publishSubject1 = AsyncSubject.create();publishSubject1.subscribe(observer);publishSubject1.onNext("A");publishSubject1.onNext("B");publishSubject1.onNext("C");AsyncSubject<String> publishSubject2 = AsyncSubject.create();publishSubject2.subscribe(observer);publishSubject2.onNext("A");publishSubject2.onNext("B");publishSubject2.onNext("C");publishSubject2.onCompleted();System.out.println();}
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3d人脸识别算法opencv_热招职位算法类

1.资深算法工程师leader-AI平台地点&#xff1a;深圳工作职责1、推进机器学习及计算机视觉领域的核心算法&#xff1b;2、构建机器学习及计算机视觉领域的关键应用&#xff1b;3、将算法于实际应用场景相结合&#xff0c;构建算法和应用的正反馈机制。任职资格1、较强的学术背景…

Android Gradle编译问题

1. Could not find lint-gradle-api.jar (com.android.tools.lint:lint-gradle-api:26.1.2). Searched in the following locations:https://jcenter.bintray.com/com/android/tools/lint/lint-gradle-api/26.1.2/lint-gradle-api-26.1.2.jar 解决方法&#xff1a; 根build.gr…

python vtk_VTK在python环境下的安装和调用

vtk,很好玩的一个可视化工具&#xff0c;有python接口。 一、安装&#xff1a; 1、平台&#xff1a;window7, python2.7 2、下载vtk: vtkpython-7.1.1-Windows-64bit.exe (http://www.vtk.org/files/release/7.1/vtkpython-7.1.1-Windows-64bit.exe 或 http://download.csdn.ne…

CruiseControl.NET与TFS结合的配置文件

配置如下&#xff1a; <cruisecontrol xmlns:cb"urn:ccnet.config.builder"><project name"测试项目" ><webURL>http://192.168.1.168/ccnet/</webURL><labeller type"dateLabeller"/><workingDirectory>D:…

Android File.listFiles()返回null问题

File.listFiles()返回null可能原因是没读取sdcard权限(READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE)。 system/private-app默认都有权限&#xff0c;system/app某些系统模式下初始化后没权限&#xff0c;系统重启后有权限&#xff0c;第三方app的权限大部分是询问。 使用C…

android中实现简单的播放

1 MediaPlayer mediaPlayer1; 2 mediaPlayer1 MediaPlayer.create(getBaseContext(), R.raw.ic_yanyuan); 3 mediaPlayer1.start(); 需要在res下面新建个raw&#xff0c;然后拖拽进去一个音乐文件。转载于:https://www.cnblogs.com/yi-mi-yangguang/p/5765401.html

python能代替vba吗_VBA会被Python代替吗?

最近内测版Excel中的vlookup函数被xlookup函数代替了&#xff0c;但vlookup函数依然得到了保留。类似的&#xff0c;对于生产力工具Office套件而言&#xff0c;保证兼容性是重要的&#xff0c;Office诞生以来出现的所有功能在最新版中依然会找得到&#xff0c;因此作为内建在Of…

获取apk安装包sha1的值

1. 解压apk&#xff0c;进入解压目录&#xff0c;找到META-INF/CERT.RSA&#xff0c; 2.执行命令 keytool -printcert -file .../META-INF/CERT.RSA 可以得到md5和sha1值 证书指纹: MD5: 8D:DB:34:2F:2D:A5:40:84:02:D7:56:8A:F2:1E:29:F9 SHA1: 27:19:6E:38:6B:…

nginx 不带www到www域名的重定向

如果是单次重定向用 redirect, 如果永久跳转用 permanent&#xff0c;这里用 permanent { listen 80; server_name xxx.com www.xxx.com; index index.html index.php; root /data/www/wwwroot; if ($http_host !~ "^www.xxx.com$") { rewrite ^(.*) ht…

python dropna失败_使用Python部署机器学习模型的10个实践经验

作者&#xff1a;Pratik Bhavsar编译&#xff1a;ronghuaiyang导读使用python部署ML项目的一些经验。有时候&#xff0c;作为数据科学家&#xff0c;我们会忘记公司付钱让我们干什么。我们首先是开发人员&#xff0c;然后是研究人员&#xff0c;然后可能是数学家。我们的首要责…

ClassCastException:AdaptiveIconDrawable cannot be cast to BitmapDrawable

Caused by: java.lang.ClassCastException: android.graphics.drawable.AdaptiveIconDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 出现原因是因为应用适配了API 26的自适配图标adaptive-icon&#xff0c;使用下面的方法读取icon&#xff0c;读取到应…

【JDK1.8】Java HashMap实现细节

底层是用数组实现的 /*** The table, initialized on first use, and resized as* necessary. When allocated, length is always a power of two.* (We also tolerate length zero in some operations to allow* bootstrapping mechanics that are currently not needed.)*/tr…

Android实现圆角照片和圆形照片

方法1: 使用RoundedBitmapDrawable public static RoundedBitmapDrawable bitmapToRoundedDrawable(NonNull Resources res, NonNull Bitmap bitmap,boolean circular, float cornerRadius) {RoundedBitmapDrawable drawable RoundedBitmapDrawableFactory.create(res, bitma…

python判断字符串长度_Python|判断字符串是否符合日期要求

问题描述 1.题目要求&#xff1a; 输入一串字符,由字母、数字和空格组成&#xff0c;长度<1000,判断其中是否存在日期格式的数据。日期格式的数据具有如下的特征&#xff0c;连续包含年份和月份信息。年份信息是指连续的四个数字,之后是Jan, Feb, Mar,Apr, May, Jun, Jul, A…

剑客决斗(NYOJ 110)

T3、题目110剑客决斗 &#xff08;http://acm.nyist.net/JudgeOnline/problem.php?pid110&#xff09; 描述 在路易十三和红衣主教黎塞留当权的时代&#xff0c;发生了一场决斗。n个人站成一个圈&#xff0c;依次抽签。抽中的人和他右边的人决斗&#xff0c;负者出圈。这场决斗…

Android P 网络报错 : java.io.IOException: Cleartext HTTP traffic to ***.com not permitted

在Android P 使用HttpUrlConnection进行http请求会出现以下异常 java.io.IOException: Cleartext HTTP traffic to ***.com not permitted at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115) at com.android.ok…

linux免密登录_Linux SSH免密钥登录总结

Linux下生成密钥通过命令”ssh-keygen -t rsa“生成之后会在用户的根目录生成一个 “.ssh”的文件夹进入“.ssh”会生成以下几个文件authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥id_rsa : 生成的私钥文件id_rsa.pub &#xff1a; 生成的公钥文件…

Android studio aar包多层嵌套,Add library ‘Gradle: __local_aars__: 。。。unspecified@jar‘ to classpath

编译出错报的日志&#xff1a; FAILURE: Build failed with an exception. * What went wrong: Execution failed for task :toolbox:compileReleaseJavaWithJavac. > Compilation failed; see the compiler error output for details. 出错的代码提示&#xff1a; Add …

约瑟夫环数数

题目&#xff1a; 有n个孩子站成一圈&#xff0c;从第一个孩子开始顺时针方向报数&#xff0c;报到3的人出列&#xff0c;下一个人继续从1报数&#xff0c;直到最后剩下一个孩子为止。问剩下第几个孩子。 (另一种题型 -> 约瑟夫环 -> 递归算法 http://www.cnblogs.com/…

eclipse 中文_谁说API必须用英文?中文API的Java库可以有!

是不是看惯了文档里的英文接口(API)&#xff0c;也在 IDE 里看惯了自动补全里的英文接口&#xff1f;现今的绝大多数 API 的确是英文命名没错&#xff0c;但绝非不能或者不应该实现和发布中文 API 的库。这里用一个简单的汉字简繁转换库为例。在命名上&#xff0c;API 的方法名…