写个hello world了解Rxjava
spring boot 项目中使用Rxjava2
什么是Rxjava?
来自百度百科的解释
RxJava - JVM响应式扩展Reactive Extensions 用于使用Java VM的可观察序列编写异步和基于事件的程序的库。
ReactiveX是一个通过使用可观察序列来编写异步和基于事件的程序的库。
它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O。
在微服务中的优点
隔离每个服务,即使单个服务的响应失败了,也不会影响整个请求的响应。
上手使用
引入依赖
Rxjava 的版本:https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava
本次采用最新的2.2.2版本
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.2.2</version>
</dependency>
在spring boot中引入依赖后就可以使用Rxjava了,下面通过写一组hello world来看看Rxjava的基本原理。
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
public class Test {
public static void main(String[] args) {
//first
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> observableEmitter) throws Exception {
observableEmitter.onNext("Hello World");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
//second
System.out.println("------------------------------------");
Observable.just("hello world").subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
System.out.println(s);
}
});
//third
System.out.println("------------------------------------");
Observable.just("hello world").subscribe(System.out :: println);
}
}
输出信息:
Rxjava 使用三步走
- 创建被观察者(Observable)
- 创建观察者(Observer)
- 订阅(subscribe)
浅谈分析Rxjava中的被观察者,观察者
第一种写法通过create来创建一个观察者,而第二种第三种直接通过just方法来快速创建一个观察者
Observable.create(new ObservableOnSubscribe<String>() {})
Observable.just()
查看源码:
//create方法
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}
//just方法
public static <T> Observable<T> just(T item) {
ObjectHelper.requireNonNull(item, "The item is null");
return RxJavaPlugins.onAssembly(new ObservableJust(item));
}
显而易见两者方法最终的实现都是一样的,只不过是哪个写法更简洁点;本次只是入门级的了解,更深层次的源码研究放到之后。
从源码来看subscribe()方法,可以看出有多个重载方法。下面我们具体说下Observable相关的内容
上面的“hello world”案例是通过subscribe(Constumer<? super T> onNext)这个重载方法写的,下面是通过
subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete),
subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable>两种写法
subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete)方法:
Observable.just("hello world!")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
//首先执行该方法,也就是onNext
System.out.println(s);
//当抛出异常时会走到onError方法,action方法不会再执行
//throw new Exception("error");
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//当onNext发生异常时,此方法才会被执行
System.out.println(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
//该方法是执行onNext之后执行的
System.out.println("onComplete");
}
});
subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable>方法
Observable.just("hello world!")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
}, new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
System.out.println("onSubscribe");
}
});
打印结果:
onSubscribe
hello world !
onComplete
因为我们使用的Rxjava2的版本,所以我们需要使用Observer作为观察对象,我们针对上面的写法,再次优化
Observable.just("hello world!")
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable disposable) {
System.out.println("onSubscribe");
}
@Override
public void onNext(@NonNull String s) {
System.out.println("onNext");
}
@Override
public void onError(@NonNull Throwable throwable) {
System.out.println("onError");
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
});
打印信息:
onSubscribe
onNext - > hello world!
onComplete
所以,通过上面的几种“hello world”的写法,我们知道被观察者,观察者,subscribe()三者缺一不可,
只有使用了订阅(也就是subscribe()方法),被观察才会发送数据
~~~~~~~Rxjava入门继续学习中~~~~~~~~
写个hello world了解Rxjava的更多相关文章
- RxJava 和 RxAndroid 四(RxBinding的使用)
对Rxjava不熟悉的同学可以先看我之前写的几篇文章 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid ...
- RxJava 2.x 使用最佳实践
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76443347 本文出自[赵彦军的博客] 以前写过 Rxjava 系列教程, 如下所 ...
- Android Weekly Notes Issue #232
Android Weekly Issue #232 November 20th, 2016 Android Weekly Issue #232 本期内容包括: Kotlin的优势讨论; MVVM模式结 ...
- Java的演化-Java8实战笔记
一个语言要想一直有活力,它也需要跟随着时代的变化去进步,Java作为一个古老的语言,它其实有太多的历史包袱,在改变的过程中需要考虑很多,但是它也在慢慢的演变,巩固自己的城墙,不让自己被遗忘在历史中(不 ...
- 2018年Android面试题含答案--适合中高级(下)
这里是我整理出来的面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875 1.A ...
- 2016 Top 10 Android Library
过去的 2016 年,开源社区异常活跃,很多个人与公司争相开源自己的项目,让人眼花缭乱,然而有些项目只是昙花一现,有些项目却持久创造价值,为开发者提供了极大的便利,这些终究由时间来判断.今天,我就来整 ...
- 2018年Android面试题含答案--适合中高级(下)(转)
这里是我整理出来的 面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875 1. ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
随机推荐
- Sql Server 支持的数据类型
T-SQL语言和SQLServer数据库中的数据通常需要定义一个数据类型,数据类型定义了对象可以容纳的数据的种类. 哪些对象需要数据类型 (1).表和视图的列: 在定义 ...
- 个人作业2——集大通APP案例分析
个人作业2——集大通APP案例分析 产品:集大通 我认为这个是我们学校的APP,我们应该支持一下. 一.个人体验 1.下载并使用,描述最简单直观的个人第一次上手体验. ①界面美观,可以感受到丰富的校园 ...
- ORACLE默认实例设置--linux
数据库实例多了之后,每次export的时候,显示的ORACLE_SID总不是自己经常用的那个,要是能让默认的自定义就好了. 现在就解释一下在linux环境中如何定义: 1.su - oracle 2. ...
- js数组去重的方法(转)
JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...
- Extjs TreePanel API详解
转自:http://web.qhwins.com/CSS-JS-XML/2011091312092944999107.html config定义{ animate : Boolean, contain ...
- ansible--02
一.目录结构: 二.配置文件解析 1. Inventory:主机列表配置文档 2.ansible.cfg:可存放多地 2.1 ansible读取此conf的顺序:当前命令执行目录-- >用户家目 ...
- [IDE123] Intellij Idea 快捷键
Ctrl+Shift+N,可以快速打开文件 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...
- jquery mobile mobiscroll 日期插件使 用mobiscroll
官网网站: http://www.mobiscroll.com/ http://code.google.com/p/mobiscroll/ 1.精简版Demo: 查看Demo » 下载Demo » 2 ...
- R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
错误: 解决方案: 升级R3.5.0后,解决:
- css布局中关于 块状元素和行内元素的区分
这两天在准备实习的面试和笔试,准备复习一下这些基础的概念,避免自己处于一种仅脑袋理解嘴巴不能表述出来的状态. 块状元素和行内元素的概念是在css页面布局这个地方出现.主要是将html标签按照一定的特性 ...