RxJava 操作符之创建类操作符
来源:互联网 发布:java double两位小数 编辑:程序博客网 时间:2024/06/05 16:35
RxJava有很多操作符,我们从创建类操作符说起:
1、rang操作符:第一个参数范围,第二个参数数量。表示事件源发送五个不小于10的数据
这个操作符接收两个参数
//发射5个不小于10的数据 Observable.range(10, 5).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("Tag", integer + ""); Toast.makeText(MainActivity.this, integer + "", Toast.LENGTH_SHORT).show(); } });
2、just操作符:这个操作符之前用过,直接将发送数据发送出去:如果他要发送的数据是数组的话,会将数组作为一个整体一起发送出去。
String[] words = {"Hello", "Rx", "Java"}; Observable.just(words).subscribe(new Action1<String[]>() { @Override public void call(String[] s) { Toast.makeText(MainActivity.this,s.length+"", Toast.LENGTH_SHORT).show(); } });3、from操作符,如果发送的数据为单个字符串,单个数字什么的,效果跟just一样,如果发送的是数组、list什么什么的,区别在于他会将数组中的数据一个一个发送出去
String[] words = {"Hello", "Rx", "Java"}; Observable.from(words).subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } });
4、defer操作符,defer,指延时,它创建的事件流不会立即产生,只有在发生订阅关系的时候,才会产生Observable,以保证发送的数据是最新的。
final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Observable justObservable = Observable.just(df.format(new Date()));//这个时候就为Date赋值 Observable deferObservalbe = Observable.defer(new Func0<Observable<String>>(){ @Override public Observable<String> call() { return Observable.just(df.format(new Date()));//在订阅那一刻返回一个最新的Observable。 } }); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } justObservable.subscribe(new Action1<String>() { @Override public void call(String s) { textView.setText(s); //Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } }); //订阅这一刻,defer会返回一个最新的Observable,以确保数据是最新的。 deferObservalbe.subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } });
我们分别通过just和defer创建了两个事件流。just传进去一个时间,defer比较奇怪。传了个Func0对象,这个东西跟前面说到的Aciton很像,也是RxJava的一个接口,用来包装一个方法,传给另一个方法,实现闭包操作,Func包装的方法是有返回值的,而Action包装的方法没有返回值。上面我们用的是Func0<Observable<String>>,表示包装的方法没有参数的,而且该方法会返回一个Observable<Stirng>对象。如果,你看到了Func2<String,Interger,Interger>的接口,表示他会包装一个方法,该方法需要两个Interger类型的参数,并且返回一个String类型的结果。Ok,希望哥们没被我说晕。继续我们上面的代码。上面Func0包装的方法返回的Observable我们是通过just方法创造出来的,这个Observable会发送一个时间。然后我们让程序睡眠2秒钟。别太长,会ANR。接着分别取订阅,JustObservable事件流发送的时间放到textView中显示,deferObservable事件流发送的的时间用一个用Toast显示,然后通过观察发现deferObservable发送的时间更新,(晚两秒钟)
5、timer操作符,延时发送数据。接收两个参数,一个时间,一个时间单位。timer创建出来的事件流默认在computation 线程中执行,所有我们观察的时候要切换到主线程。这个线程的调度器上次提到了哈。
//延时发送操作,五秒后发射,默认运行在computation Scheduler Observable.timer(5, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Toast.makeText(MainActivity.this, "这是五秒后接受到的", Toast.LENGTH_SHORT).show(); } });
6、Rxjava的轮询器,间隔发送整数序列(并且可以指定延时),比timer多了轮询。默认运行在computation Scheduler,下面的例子为三秒后发送数据,每隔五秒发送一次,当然你也可以指定两个参数,就是不延时直接轮询发送。
Observable.interval(3, 5, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Toast.makeText(MainActivity.this, aLong+"", Toast.LENGTH_SHORT).show(); } });它会一直发送数据,一直发送,直到订阅者主动调用unsubscribe()取消订阅为止。
----------------------------------------------------------刘诗诗的事业线------------------------------------------------------
到上面创建类的操作符应该涵盖的差不多了,不知道有没有漏掉哪个。下面要说的两个操作符虽然不是创建类的操作符,但是功能给创建类的操作符挺像,在这加上,以作比较。
7、delay操作符,延迟一段时间,再发送来自事件流发送的结果,功能虽然跟timer类似,但是级别更低,用于事件流过程中的操作,可以延迟发送事件流中的某一次发送。
Observable.just("延时五秒钟发送我").delay(5,TimeUnit.SECONDS).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } });
//重复发送五次,默认运行在新线程 Observable.just("我会出现5次").delay(3, TimeUnit.SECONDS).repeat(5) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); } });
这个例子可以看到,操作符可以累加操作,而且是个线性的过程。创建类的操作符先记录到这里,下次玩下变换类的操作符。
代码地址:
https://github.com/dagaozi/RxjavaDemo
0 0
- RxJava操作符之创建操作符
- RxJava 操作符之创建类操作符
- RXJava 创建操作符
- RXjava 创建操作符
- RxJava学习之创建型操作符
- RxJava操作符之创建操作符(三)
- RxJava 之 操作符
- RxJava 创建操作符create
- RxJava 创建操作符form
- RxJava 创建操作符 just
- RxJava 创建操作符 defer
- RxJava-创建Observable操作符
- RxJava操作符(1)-创建
- RxJava创建类型操作符
- RxJava—创建操作符
- RxJava----操作符:创建操作符
- RxJava操作符-创建操作符
- RxJava操作符(02-创建操作)
- SVN查找某个作者的
- 在Windows服务器上启用TLS 1.2及TLS 1.2基本原理
- redis获取的集合转换成普通list/map集合
- js限制上传文件大小
- maven的版本管理(七)
- RxJava 操作符之创建类操作符
- ios、Android、java通用AES加密方式
- ARM C 库中的线程安全性
- 图像分割基础算法及实现实例
- Linux修改文件属性和权限
- LeetCode[137]Single Number II
- 软件设计模式:享元模式(Flyweight)
- css不确定宽度的水平居中
- spring bean的scope属性