RxJAVA学习笔记(一)

TOPSIS与熵权法实战:从数学建模到Python实现(附国赛案例分析) 本文详细解析了TOPSIS(逼近理想解排序法)与熵权法在数学建模中的协同应用,并通过Python代码实现完整流程。文章以国赛案例为背景,从指标正向化、数据标准化、熵权法计算客观权重,到TOPSIS综合排序,手把手指导如何解决多指标决策问题,为数据分析与建模提供了一套可复用的实战工具箱。 阅读详情

RxJAVA使用的是响应式编程方式:

响应式编程是一种建立在异步数据流概念上的编程思想。一个数据流可以被过滤,操作,和另外一条数据流合并形成一条新的数据流。

响应式编程主要的是事件,事件可以被等待,可以触发过程,还可以触发另外一些事件,

RxJAVA与纯粹JAVA有什么不同

RxJAVA是从经典的GOF观察者模式继承而来的。

同时RxJAVA添加了以下经典观察者模式没有的能力:

  • 生产者能通过onComplete()事件通知消费者,现在已经没有任何数据;
  • 生产者能通过onError()事件,通知消费者,出现错误;
  • RxJAVA Observable可以不用嵌套调用。

在RXJAVA中最主要的三个方法是:onNext(),onComplete(),onError()。

为什么要使用Observables

在面向对象的编程中,需要努力创建解耦的实体。是程序更容易被测试,重用,维护,当改变某一些功能时,不会影响到其他的东西,

MVC框架模式是第一个用来解决这种问题的。

在GOF书中,观察者模式也是一种,它是一种一对多(one-to-many)的 方式来绑定多个对象,当一个对象发生变化时,其他的多个依赖于它的对象能得到通知,并自动发生相应的变化。

观察者模式

观察者模式是软件设计模式中出现最频繁的模式之一。它建立在subject的基础上。一个subject是一个特殊的对象,它包含了一系列想要在它改变
时得到通知的对象。这些对象称作观察者( Observers) ,它们暴露一些用来通知的方法,这些方法会在subject的状态产生变化时得到调用。

下图描述了subject/Observer的关系是一个一对多的关系 。

图中展示了一个subject能为3个Observer服务。很明为,没有理由限制Observer的数量。一个subject可以有无限多个Observer,而且在subject产生变化时,所有Observer能得到通知。

什么时候使用观察者模式

  • 当你的构架中包含有两个实体,一个依赖于另一个,你想保持他们是分开的,而且像重用他们;
  • 当一个改变中的对象想在自己发生变化是通知未知数量与自己相关的对象发生相应的变化;
  • 当一个改变中的对象想通知那些它不清楚的对象时。

观察者模式工具箱

在RxJAVA中有以下:

  • Observable
  • Observer
  • Subdcriber
  • Subjects

Observables和Subjects是两个生产者, Observer和Subscriber是两个消费者实体。

Observable

当我们要执行一些轻量级的异步任务时, Java提供了一些经典的类,比如Thread,Future,FutureTask,CompletableFuture,来解决这些问题。当复杂度增加时,这个解决方法会变得杂乱,难以维护。特别是,它们不能形成链。RxJava的Observables就是为了解决这些问题设计的。它们灵活好用,能被链接起来,能产生单一的结果,或者更好,产生序列。无论何时你想发射一个新的单一值或者一系列的值,或者是一个无穷尽的流,你都可以使用Observable。
Observalbe的生命周期包括3个可能的事件,我们可以和Iterable类比。下边这个表展示
Observable的生命周期包含三个可能的事件:
1. onNext()
2. onCompleted()
3. onError()
下面将Observable的async/push和Iterable的 sync/pull:进行比较

创建一个Observable

Observable.create()
create()方法提供了一个创建Observable的能力。它
它使用一个OnSubscribe的参数对象,这个OnSubscribe继承于Action1,并且在有观察者订
阅我们的Observable时执行call方法。

Observable.create(new Observable.OnSubcribe<Object>()){
@Obverride
public void call(Subscriber<? super Object> subscriber){
}
});

Observable 使用subscirber变量并根据不同条件来调用它的方法来和Observer通信。

Observable<Integer> observablestring=Observable.create(new
Observable.OnSubscribe<Integer>(){
@Override
public void call(Subscriber<? super Integer> observer){
for(int i=0;i<5;i++){
observer.onNext();
}
observer.onCompleted();
}
});

我们创建一个新的Observable项,它执行一个产生5个元素的for循环,然后一个个的发射这些元素,然后完成发射。
另一方面,我们向Observable订阅,得到一个Subscription对象。从订阅的那一刻起,我们就开始接收integers,一个个打印它们。我们不知道将要接收
多少个integer。其实我们不需要知道。因为我们为可能发生的每个情况都提供了相应的动作响应:

如果得到一个integer,就打印它
如果序列到达最末端,我们打印一个结束信息
如果错误发生了,我们打印一个错误信息

Observable.from()

在前面一个例子中,我们创建了一序列的integer,然后一个个发射它们。如果我们已经有一个list,该怎么做呢?我们继续用这种循环的方式一个个发射
它们吗? 在接下来的示例代码中,我们从已有的list中创建一个Observable:

List<Integer> items = new ArrayList<Integer>(); items.add(1);
items.add(10);
items.add(100);
items.add(200);
Observable<Integer> observableString = Observable.from(items); Subscription subscriptionPrint =
observableString.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh no! Something wrong happened!");
}
@Override
public void onNext(Integer item) {
System.out.println("Item is " + item);
}
});

from()创建器能从一个列表或数组中创建Observable,一个个的发射列表或数组里面的对象。或者从Future当中,发射Future对象的.get()结果。传递Future参数,我们甚至能指定一个超时时间。 Observable会等待Future的结果,如果在超时时间后没能等到结果,它会调用onError()方法并通知Observer发生了错误。

Observable.just()

如果我们已经有一个典型的Java方法,想把它转换成Observable该怎么做?我们有使用create()方法,像我们前面看到过的一样。或者,使用just()方法来
避免大量的样板代码:

Observable<String> observableString = Observable.just(helloWorld());
Subscription subscriptionPrint = observableString.subscribe(new Observer<String> () {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh no! Something wrong happened!");
}
@Override
public void onNext(String message) {
System.out.println(message); }
});

helloworld()方法

privatte String helloWorld(){
return "Hello World";
}

just()创建器能接受1到9个参数。它按参数顺序发射这些值。 just()方法同时也接受list或者arrays,但和from()不同,它不会迭代这些List一个个的发射,而是发射整个list。一般的,当我们想发射一个定义好的set时使用它。我们可以使用just()来写出更有组织的和可测试的代码。 最后要提的是,当just()发射完值后, Observable会正常的结束。

Observable.empty(),Observable.never()和Observable.throw()

当由于某些原因,我们有时候需要不发射任何东西,只想正常结束的,这时我们可以使用empty()。我们可以使用never()产生一个不发射任何东西并且永远不结束的Observable。我们可以使用throw()来产生一个不发射值,并以错误结束的Observable。

Subject=Observable+Observer

一个Subject是一个有魔力的对象,它能同时成为Observable和Observer。它像一座桥连接两个世界。一个subject能向一个Observable订阅,这时它的动作像一个Observer。它能发射新item,甚至传递这些值,像一个Observable一样。
当subject向Observable订阅时,它会触发Observable的发射动作。如果原始的Observable是冷的,这会使原来冷的Observable变热。
RxJava 提供4种不同的subject:

PublishSubject
BehaviorSubject
ReplaySubject
AsyncSubject

PublishSubject

PublishSubject 是基本的Subject对象。让我们看一下经典的hello world程序,使用PublishSubject来达成。

PublishSubject<String> stringPublishSubject = PublishSubject.create();
Subscription subscriptionPrint = stringPublishSubject.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh no! Something wrong happened!");
}
@Override
public void onNext(String message) {
System.out.println(message); }
});

在这个例子中,我们创建了一个PublishSubject,它使用create()方法发射一个字符串,然后我们向它订阅。这个时候,是没有任何item是被发射的,我们的Observable是在等待,并且等待时不用阻塞线程和消耗资源。它就在那里,准备从subject接收值。如果subject不发射任何值的话,我们的Observer会永远等待。重申一次,不要担心 ,因为我们的Observer在任何情况下都知道该怎么做。什么时候会发射值我们不关心,因为这是响应式编程,系统会自动响应。我们也不关心它什么时候会响应。我们只关心响应的时候会发生什么动作。 最后一行代码展示了手动发射我们的hello world字符串,它触发了Observer的onNext()方法,让我们在控制台打印出了“hellow world”。让我们看一个更复杂的例子。假设我们有一个私有的Observable,它不能从外面访问到。这个Observable在它的生命周期中发射值。我们不关心这些值,我们只关心它的终止。
首先,我们创建一个新的PublishSubject,在它的onNext()方法中响应,它能被外界访问 到:

final PublishSubject<Boolean> subject = PublishSubject.create();
subject.subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean completed) {
System.out.println("Observable completed!");
}
});

然后,我们创建一个私有的Observable,它只能访问到这个subject:

Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 5; i++) {
subscriber.onNext(i);
}
subscriber.onCompleted();
}
}).doOnCompleted(new Action0() {
@Override
public void call() {
subject.onNext(true);
}
}).subscribe();

这个Observable.create()方法包含了我们熟悉的发射数字的for循环。 doOnCompleted()方法指明了当Observable结束时会向subject发射true值。最后,我们向这个Observable订阅,明显的,这个空的subscribe()方法只是简单的开启Observable的发射动作,而忽略它发射的具体值以及它的完成或错误事件。
在这个例子中,我们创建了一个能连接到Observable并同时能被观察的实体。在我们想创建一个分离的,抽象的,或观察一个普通对象时极其有用。

BehaviorSubject

BehaviorSubject会发射最近的一个值,和被订阅后的值。

BehaviorSubject<Integer> behaviorSubject=BehaviorSubject.create(1);

在这个简短的例子中,我们创建了一个发射整型的subject.BehaviorSubject需要一个初始值,因为当有观察者订阅它的时候,它需要发射最近的一个
值。

ReplaySubject

ReplaySubject 缓存了所有的item,当有订阅者订阅的时候,它发射所有的item。

AsyncSubject

AsyncSubject在Observable结束时对所有订阅它的观察者发射它的最后的一个值。

总结

现在我们知道了RxJAVA是采用的观察者模式, RxJava中的Observable有三个事件
1.onNext(),
2.onCompleted(),
3.onError(),
create()创建一个Observable;
from()能从一个数组或者列表中创建Observable;
just()创建器能接受1到9个参数。它按参数顺序发射这些值。 just()方法同时也接受list或者arrays,但和from()不同,它不会迭代这些List一个个的发射,而是发射整个list。

声明:本文是学习http://pan.baidu.com/s/1bovLc8B的笔记;若有需要请下载原文查看:

C#操作MySQL从入门到精通(3)——新建数据库、新建表 我们要首先新建一个数据库,并且在数据库中新建一系列的表来管理数据库。 阅读详情

相关推荐

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

java响应式编程框架_Android框架第(三)篇--响应式编程

版权声明:本文为小斑马伟原创文章,转载请注明出处!RxJava响应式编程上篇简单的阐述了响应式编程的基本理论。这篇主要对响应编程进行详细的介绍。以及主要介绍响应编程的主要实现-RxJava。其中RxJava的操作符和调度器(Scheduler)主要介绍对象。一、什么是响应式编程?响应式编程:是一种基于异步数据流概念的编程模式。关键概念:事件 把现实中的事件, 搬到软件中区去, 事件过程等待 触发到...

weixin_36086687的博客 264

数字通信:信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码

在通信系统中,信息的传输通常需要经过一系列的处理步骤,确保数据可以在信道中高效且可靠地传输。以下是信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码的具体含义及其常见技术的解释。

weixin_44012667的博客 4810

RxJava 错误处理操作符(Error Handling Operators)

在Observable发射数据时,有时发送onError通知,导致观察者不能正常接收数据。可是,有时我们希望对Observable发射的onError通知做出响应或者从错误中恢复。此时我们该如何处理呢?解决办法就是使用Error handling相关的操作符来集中统一地处理错误。RxJava中错误处理的操作符为 Catch和 Retry。Catch  Catch操作符能够拦截原始Observable

Dream It Possible 1万+

YOLOv8的Anchor-Free革新:从中心点预测到动态IoU匹配的全面解析

本文深入解析了YOLOv8采用Anchor-Free(无锚框)设计的核心优势与实现机制。通过摒弃预设锚框,模型直接预测目标中心点与宽高,结合解耦头、动态IoU匹配及Varifocal Loss等创新,显著简化了训练流程并提升了检测精度,尤其在小目标检测和模型泛化能力上表现突出。

weixin_29094301的博客 356

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

冲击10w 1万+

RxJava 学习笔记一

RxJava 学习笔记一原文链接:深入浅出RxJava(一:基础篇) 创建一个Observable对象,直接调用Observable.createObservable<String> myObservable = Observable.create( new Observable.OnSubscribe<String>() { @Override public vo

lwjlol的博客 379

深度解读 ABAP CDS View 中的 @Analytics.dataCategory: #FACT 注解

注解在 ABAP CDS View 中具有重要意义。它不仅定义了当前视图在数据模型中的角色,还为后续的分析和报告奠定了基础。在实际开发中,通过合理使用这一注解,可以显著提升数据模型的可用性和系统性能。无论是简单的 KPI 展示还是复杂的多维分析,这一注解都能发挥关键作用。

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

RxJava学习笔记(一)

RxJava已是流行了一段时间了,我也是刚刚捡起来学习,做点笔记,分享给大家看看。 我是看了这个文章开始学的, *** 学习参考博客: https://asce1885.gitbooks.io/android-rd-senior-advanced/content/che_di_le_jie_rxjava_ff08_yi_ff09_ji_chu_zhi_shi.html ***

zengkeqiong的博客 1047

使用LabVIEW创建和分析柱状图:从基础绘制到高级数据分析的完整指南

LabVIEW,全称为Laboratory Virtual Instrument Engineering Workbench,是由美国国家仪器公司(National Instruments, NI)开发的一款图形化编程语言。自1986年首次推出以来,LabVIEW凭借其强大的数据采集、分析和控制能力,在工程、科研、教育等领域得到了广泛应用。与传统的文本编程语言不同,LabVIEW采用了图形化编程方式,用户通过连接不同的函数节点来实现复杂的逻辑和算法。

qq_38334677的博客 775

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 385

RxJava 学习笔记(一)

最近Android6.0的权限问题,要把之前的APP进行改造,用到了RxPermission框架!之前了解过RXJAVA,但是由于之前项目一直没有使用这个框架,所以也就一直搁置了。正好Rxpermission框架里用到了RXJAVA的内容,索性就学习了一下。 在正文开始之前的最后,放上GitHub链接和引入依赖的gradle代码: Github:https://github....

akxdpr0451的博客 220

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4467

Java中expecial,RxJava 学习笔记 (一)

作者: 一字马胡转载标志 【2017-12-13】更新日志日期更新内容备注2017-12-13RxJava学习笔记系列系列笔记 (一)2017-12-15增加系列笔记(二)2017-12-15 21:36考虑到RxJava很大程度上用于android开发中,而我自身不是移动开发者,所以暂时将RxJava学习笔记系列挂起,在未来需要使用RxJava的时候再继续学习,并且结合实际的应用来学习会收获更多...

weixin_39633452的博客 463

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Rxjava学习笔记(一)

Rxjava学习基本用法 Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e)

AINewBegin的专栏 434

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RxJava学习笔记(一)概念

RxJava 学习笔记(一)概念Rxjava 从去年开始就有耳闻,在各大开源项目中也可以看到有使用他的,各大牛也说他好用,既然大家都说好,具体好不好我们自己学着用一下就知道了,刚好这段时间项目闲下来就来学习一下RxJava。1 是什么同样,在用一个东西之前,要先知道他是什么东西。“RxJava is a Java VM implementation of Reactive Extensions: a

moxiouhao的专栏 681

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Rxjava学习笔记(一)

RxJava 2.0

prefer_tyl 859

Rxjava 2学习笔记(一)

Rxjava 2学习笔记(一)   Rxjava 在这些年在android开发中非常的火爆,它和Retrofit 的结合堪称完美,他们可以把我们从以前我们进行网络请求中各种线程切换,各种接口回掉中解放出来了。可以让我们的逻辑变的非常清晰,便于代码维护。我们公司的项目目前使用的Rxjava 版本还是1.0版本的,准备打算升级到使用Rx2.0。所以打算学习一下Rxjava 2 Observable.c...

huangjie的博客 399

RxJava :源码学习笔记(一)

先来个最简单的例子 Observable .create( // 此处称为起点,source new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableE

临木的博客 160

Rxjava2.0学习笔记(一)

吐槽 突然写完游戏,,不知道安卓自己要学什么,明明自己安卓方面还是什么都不会,但有点迷,就最近学下Rxjava,因为可能他在网络这块用处大,自己也要继续把自己的卡片项目写完,java的相关知识也要跟上学习。 什么是Rxjava RxJava 是一个 基于事件流、实现异步操作的库 由于 RxJava的使用方式是:基于事件流的链式调用,所以使得 RxJava 更重要的是,随着程序逻辑的复...

sakurakider的博客 262

项目实训(一)Rxjava 2.0 学习笔记

我感觉Rxjava像是一条流水线,一块原料到来经过层层加工最后交给订阅者,当然不处理直接交给订阅者也可以。 从基本设计(Rx1.0)来看,Observable有一个内部类实例OnSubscribe,当Observable调用subscribe时会调用这个OnSubscribe的call。这就是全部。一般来说会在call里调用Subscriber的方法将信息传递过去。由此基本逻辑,又延伸封装出各种...

Starybirds7的博客 407

rxjava学习笔记(一)订阅关系、线程操作、操作符

rxjava /** * 观察者 Observer * 被观察者 Observable * 订阅 subscribe * 发射 ObservableEmitter * 中断接收 Disposable */ rxjava //创建一个被观察者 Observable observable = Observable.create(new ObservableOn...

a358333644的博客 354

RxJava学习笔记(一)--- 基础篇

最近项目中有用到RxJava来进行响应式编程,目前对这部分内容还比较陌生,于是决定开始一波RxJava相关内容的学习,想尽快掌握这门技术。在网上还是有很多相关的资源,我的博客仅作为相关内容的搬运工,希望在搬运的过程中提高自己的能力。在此推荐一个RxJava的专题网站,并在博文开始之前感谢“泡在网上的日子”对RxJava相关知识较为详尽的整理。

siguoyi的博客 1021

RxJava学习笔记-从源码到应用(一:简介及基本元素源码分析)

响应式编程思想 响应式编程(Reactive Programming,RP)是一种面向 数据流 和 变化传播 的 编程范式 相关概念 数据流 只能以事先规定好的顺序被读取一次的数据的一个序列。在计算机中是数据,在现实中可以是任意对象组成的有序的队列。就像看电影排队进场一样,一个接一个的检票,这些排队进场的人们就像一个有顺序的队列。 变化传播 类似于观察者模式,变化了...

当下 653

一看就懂的RxJava源码分析

本文对于RxJava的源码进行分析,以更加彻底的了解RxJava的实现思路。

Mekeater的博客 2394
上一篇: FlatBuffers学习笔记二
下一篇: android studio的简单介绍及安装
cbing111
博客等级 码龄12年 5粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值