Rxjava2实战--第三章 创建操作符
Rxjava2实战--第三章 创建操作符
Rxjava的创建操作符
| 操作符 | 用途 |
|---|---|
| just() | 将一个或多个对象转换成发射这个或者这些对象的一个Observable |
| from() | 将一个Iterable、一个Future或者一个数组转换成一个Observable |
| create() | 使用一个函数从头创建一个Obervable |
| defer() | 只有当订阅者订阅才创建Observable,为每个订阅者创建一个新的Observab |
| range() | 创建一个发射指定范围的整数序列的Observable |
| interval() | 创建一个按照给定的时间间隔发射整数序列的Observavble |
| timer() | 创建一个在给定的延时之后发射单个数据的Observable |
| empty() | 创建一个什么都不做直接通知完成的Observable |
| error() | 创建一个什么都不做直接通知错误的Observable |
| nerver() | 创建一个不发射任何数据的Observable |
1.create、just和from
1.1 create
使用一个函数从头开始创建一个Obervable
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
for (int i = 0; i <10 ; i++) {
emitter.onNext(i);
}
emitter.onComplete();
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println(throwable.getMessage());
throwable.printStackTrace();
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
执行结果:
0
1
2
3
4
5
6
7
8
9
onComplete
1.2 just
创建一个发射指定值的Observable。
发射单个数据:
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 {
throwable.printStackTrace();
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
执行结果:
Hello World
onComplete
just类似于from,但是from会将数组或Iterable的数据取出然后逐个发射,而just只是简单地原样发射,将数组或Iterable当单个参数。
它可以接受一至十个参数,返回一个按参数列表顺序发射这些数据的Observable。
Observable.just(1,2,3,4,5,6,7,8,9,10)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
}, 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");
}
});
执行结果:
1
2
3
4
5
6
7
8
9
10
onComplete
在Rxjava2.0中,如果在just()中传入null,则会抛出一个空指针异常。
java.lang.NullPointerException: item is null
1.3 from
from可以将其他种类的对象和数据类型转换为Observable
在Rxjava中,from操作符可以将Future、Iterable和数组转换成Observable。对于Iterable和数组,产生的Observable会发射Iterable或数组的每一项数据。
1.数组:fromArray(T... items)
Observable.fromArray("hello","world")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
执行结果:
hello
world
2.Iterable:fromIterable(Iterable<? extends T> source)
Observable.fromIterable(list)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
});
执行结果:
1
2
3
4
5
6
7
8
9
10
3.fromFuture(Future<? extends T> future)
对于Future,他会发射Future.get()方法返回的数据
ExecutorService executorService= Executors.newCachedThreadPool();
Future<String> future=executorService.submit(new MyCallable());
Observable.fromFuture(future)
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
static class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("模拟一些耗时的任务...");
Thread.sleep(5000);
return "OK";
}
}
}
执行结果:
模拟一些耗时的任务...
OK
4. fromFuture(Future<? extends T> future, long timeout, TimeUnit unit)
指定超时时长和时间单位。如果过了指定的时长,Future还没有返回一个值,那么这个Observable就会发射错误通知并终止。
ExecutorService executorService=Executors.newCachedThreadPool();
Future<String> future=executorService.submit(new MyCallable());
Observable.fromFuture(future,4,TimeUnit.SECONDS)
.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 {
throwable.printStackTrace();
System.out.println(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
执行结果:
模拟一些耗时的任务...
java.util.concurrent.TimeoutException...
null
2.repeat
repeat会重复发射数据。 repeat不是创建一个Observable,而是重复发射原始Observable的数据序列,这个序列或者是无限的,或者是通过repeat(n)指定的重复次数。
1.repeat(long times)
Observable.just("hello repeat")
.repeat(3)
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
执行结果:
hello repeat
hello repeat
hello repeat
2.repeatWhen
repeatWhen不是缓存和重放原始Observable的数据序列,而是有条件地重复订阅和发射原来的Observable.
将原始Observable的终止通知(完成或错误)当作一个void数据传递给一个通知处理器,以此来决定是否要重新订阅和发射原来的observable.这个通知处理器就像一个Observable操作符,接受一个发射void通知的Observable(意思是,重新订阅和发射原始Observable)作为输入,返回一个发射void数据或者直接终止(既使用repeatwhen终止发射数据)的Observable。
当apply方法返回的是Observable.empty(),Observable.error()。则不发送事件。
Observable.range(0,9)
.repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
return objectObservable.timer(10,TimeUnit.SECONDS);
}
})
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}
执行结果:
0
1
2
3
4
5
6
7
8
0
1
2
3
4
5
6
7
8
onComplete
3. repeatUntil
repeatUntil表示直到某个条件就不再重复发射数据。当BooleanSupplier的getAsBoolean()返回false时,表示重复发射上游的Observable;当getAsBoolean()为true时,表示中止重复发射上游的Observab。
long startTimeMillis=System.currentTimeMillis();
Observable.interval(500, TimeUnit.MILLISECONDS)
.take(5)
.repeatUntil(new BooleanSupplier() {
@Override
public boolean getAsBoolean() throws Exception {
Log.e(TAG, "getAsBoolean: time:"+(System.currentTimeMillis()-startTimeMillis ));
return (System.currentTimeMillis()-startTimeMillis)>5000;
}
}).subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.e(TAG, "accept: "+aLong );
}
});
执行结果:
2019-11-13 13:42:36.672 15936-15976/com.loan.rxjavademo E/MainActivity: accept: 0
2019-11-13 13:42:37.172 15936-15976/com.loan.rxjavademo E/MainActivity: accept: 1
2019-11-13 13:42:37.673 15936-15976/com.loan.rxjavademo E/MainActivity: accept: 2
2019-11-13 13:42:38.172 15936-15976/com.loan.rxjavademo E/MainActivity: accept: 3
2019-11-13 13:42:38.673 15936-15976/com.loan.rxjavademo E/MainActivity: accept: 4
2019-11-13 13:42:38.673 15936-15976/com.loan.rxjavademo E/MainActivity: getAsBoolean: time:2513
2019-11-13 13:42:39.175 15936-16023/com.loan.rxjavademo E/MainActivity: accept: 0
2019-11-13 13:42:39.676 15936-16023/com.loan.rxjavademo E/MainActivity: accept: 1
2019-11-13 13:42:40.175 15936-16023/com.loan.rxjavademo E/MainActivity: accept: 2
2019-11-13 13:42:40.675 15936-16023/com.loan.rxjavademo E/MainActivity: accept: 3
2019-11-13 13:42:41.175 15936-16023/com.loan.rxjavademo E/MainActivity: accept: 4
2019-11-13 13:42:41.175 15936-16023/com.loan.rxjavademo E/MainActivity: getAsBoolean: time:5015
3. defer、interval和timer
3.1 defer
直到有观察者订阅时才创建Observable,并且为每个观察者创建一个全新的Observable。
defer操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个Observable,但事实上每个订阅者获取的是他们自己单独的数据序列。
static int i=10;
public static void main(String[] args) {
Observable observable=Observable.defer(new Supplier<ObservableSource<?>>() {
@Override
public ObservableSource<?> get() throws Throwable {
return Observable.just(i);
}
});
i=20;
observable.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Throwable {
System.out.println(integer);
}
});
}
执行结果:
20
3.2 interval
创建一个按固定时间间隔发射整数序列的Observable。
interval操作符返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列。
interval操作符默认在computation调度器上执行。
Observable.interval(1,TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
}
});
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
执行结果:
0
1
2
3
4
5
6
7
8
3.3 timer
创建一个Observable,它在一个给定的延迟后发射一个特殊的值。
timer操作符创建一个在给定的时间段之后返回一个特殊值的Observable。
timer返回一个Observable,它在延迟一段给定的时间后发射一个简单地数字0.
time操作符默认在computation调度器上执行。
Observable.timer(2,TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
System.out.println(aLong);
System.out.println("hello world");
}
});
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
执行结果:
0
hello world
Rxjava2实战--第三章 创建操作符的更多相关文章
- RxJava2实战---第五章 变换操作符和过滤操作符
RxJava2实战---第五章 变换操作符和过滤操作符 RxJava的变换操作符主要包括以下几种: map():对序列的每一项都用一个函数来变换Observable发射的数据序列. flatMap() ...
- RxJava2实战---第六章 条件操作符和布尔操作符
RxJava2实战---第六章 条件操作符和布尔操作符 RxJava的条件操作符主要包括以下几个: amb():给定多个Observable,只让第一个发射数据的Obsrvable发射全部数据. de ...
- RxJava2实战---第七章 合并操作符和连接操作符
RxJava2实战---第七章 合并操作符和连接操作符 RxJava的合并操作符: startWith():在数据序列的开头增加一项数据. merge:将多个Observable合并为一个. merg ...
- Rxjava2实战--第四章 Rxjava的线程操作
Rxjava2实战--第四章 Rxjava的线程操作 1 调度器(Scheduler)种类 1.1 RxJava线程介绍 默认情况下, 1.2 Scheduler Sheduler 作用 single ...
- [ABP教程]第三章 创建、更新和删除图书
Web应用程序开发教程 - 第三章: 创建,更新和删除图书 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以 ...
- .NET Core3.1 Dotnetty实战第三章
一.概要 本章主要内容就是讲解如何在dotnetty的框架中进行网络通讯以及编解码对象.数据包分包拆包的相关知识点. 后续会专门开一篇避坑的文章,主要会描述在使用dotnetty的框架时会遇到的哪些问 ...
- 学习笔记-[Maven实战]-第三章:Maven使用入门(1)
说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...
- .NET Core IdentityServer4实战 第三章-使用EntityFramework Core进行持久化配置
内容:本文带大家使用IdentityServer4进行使用使用EntityFramework Core进行配置和操作数据 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 前两章内容 ...
- [转]ionic3项目实战教程三(创建provider、http请求、图文列表、滑动列表)
本文转自:https://blog.csdn.net/lyt_angularjs/article/details/81145468 版权声明:本文为博主原创文章,转载请注明出处.谢谢! https:/ ...
随机推荐
- Linux之top 监视系统任务的工具
top 监视系统任务的工具: 和ps 相比,top是动态监视系统任务的工具,top 输出的结果是连续的: top 命令用法及参数: top 调用方法: top 选择参数 参数: -b 以批量模式运 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]
[易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...
- [angular2/4/8]用ng new创建项目卡住的解决办法
官方文档 英文版:https://angular.io/guide/quickstart 中文版:https://angular.cn/guide/quickstart Installing pack ...
- 洛谷-p5410-扩展KMP模板
链接: https://www.luogu.org/problem/P5410#submit 题意: 有两个字符串aa,bb,要求输出bb与aa的每一个后缀的最长公共前缀 思路: 扩展kmp模板, 上 ...
- Acwing-202-最幸运的数字(同余, 欧拉定理)
链接: https://www.acwing.com/problem/content/204/ 题意: 8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字. 现在给定一个正整数 ...
- yii学习笔记(四)
return $this->goBack(); // 先看看Yii::$app->user->returnUrl是否已经设置, returnUrl没有设置且goBack()中的参数也 ...
- vue的简单使用
1.使用vue 下载vue.js: 下载地址:https://vuejs.org/js/vue.min.js:打开链接后是一大堆js代码:ctrl+s保存即可: 新建一个htm ...
- http 中文乱码
string RawUrl = request.Request.RawUrl; string cc= HttpUtility.ParseQueryString(RawUrl.Substring(1, ...
- 日照学习提高班day4测试
A 思路: 一看到这个题,他不仅要求输出字典序最小的串,还要满足两两不重复,所以我们可以先输出ababab...什么的,最后缀上要求的k-2种字母 坑点: 当然这样想是不完全的!该题是拥有许多特殊情况 ...
- Spring——代理工厂实现增强
借助Spring IOC的机制,为ProxyFactory代理工厂的属性实现依赖注入,这样做的优点是可配置型高,易用性好. 1.创建抽象主题 public interface ProService { ...