RxJava2.x 操作符之 repeat

2020-03-02 14:30:53 浏览数 (2)

题图:Pixabay License

哈喽,朋友们,上一篇文章我们学习了 from 操作符,今天我们继续来学习 repeat 操作符。

我们都知道 repeat 是重复的意思,也就是说这个操作符就是帮助我们来操作处理一些重复的数据或者操作,repeat 有三个相关的操作符:repeat、repeatWhen、repeatUntil,从字面也很好理解,repeat 就是简单的重复操作,repeatWhen 当达到什么条件的时候重复,repeatUntil 是直到某个条件不在重复。

1.repeat

举个简单的例子吧,例如我们想重复打印一下 “Hello World!”,我们就可以这么写:

代码语言:javascript复制
    private void repeat() {
        Observable.just("Hello World!")
                .repeat(3)
                .subscribe(s -> LogUtil.i(TAG, s));
    }

很简单吧,这个就不用我多说了吧。需要注意的是,如果不指定重复的次数,则会无限地重复下去!

2.repeatWhen

例如,我们想按顺序打印 0-3 的数字,当 2 秒后我们再重复打印一次,我们就可以这么写。

代码语言:javascript复制
    Observable.range(0, 4)
                .repeatWhen(objectObservable -> Observable.timer(2, TimeUnit.SECONDS))
                .subscribe(integer -> LogUtil.i(TAG, "integer==="   integer));

上面的代码也比较简单,首先我们使用了一个新的操作符 range,也就是范围的意思,我们可以用它来指定一个数字的范围,并按顺序发射出去,repeatWhen 中使用了一个新的操作符 timer,我们用他创建了一个定时器的被观察者对象,并指定了两秒的时长,当到达 2 秒时就会重复原始的 Observable 并重新订阅和发射。

3.repeatUntil

例如,我想间隔 1 秒顺序打印数字 0-2,当从开始打印到第 5 秒的时候就停止打印,代码如下:

代码语言:javascript复制
    Observable.interval(1000, TimeUnit.MILLISECONDS)
                .take(3)
                .repeatUntil(() -> System.currentTimeMillis() - currentTimeMillis > 5000)
                .subscribe(aLong -> LogUtil.i(TAG, "aLong==="   aLong));

这里我们使用了一个新的操作符 interval,它可以指定时间单位的时长发送数字序列,还有一个操作符是 take,它表示只取前 3 个,注意:从 0 开始,不包含它自己,接下来我们在 repeatUntil 里加了个判断,当大于 5 秒就停止重复打印。

执行结果如下:

代码语言:javascript复制
I/RxJavaOperatorActivity: aLong===0
I/RxJavaOperatorActivity: aLong===1
I/RxJavaOperatorActivity: aLong===2
I/RxJavaOperatorActivity: aLong===0
I/RxJavaOperatorActivity: aLong===1
I/RxJavaOperatorActivity: aLong===2

怎么样?是不是立马就明白了。

好了,今天的学习内容就算完成了,感觉是不是非常简单?如果你学会了就赶紧动手去实践一下吧,说不定你会有新的发现哦!

最后,我和大家分享一下我学习的一些经验或者是见解吧。我们再学习的过程中,可能学的很多东西都是点状的,我们要把学习到的东西学会融会贯通,将他们连接成线即学会相互联系,再将线形成面,再形成体,这样我们学到的知识才能形成一个完整的知识体系,不要只见树叶,不见森林,希望大家在学习的过程中,多思考,多总结!

0 人点赞