RxJava 操作符之创建类操作符

时间:2022-10-07 17:45:25

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发送的时间更新,(晚两秒钟)

RxJava 操作符之创建类操作符


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();
}
});


8、Repeat操作符,重复发送,默认运行在新线程。

 //重复发送五次,默认运行在新线程
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