了解 RxJava 定时器、延迟和间隔运算符
我们将在这篇文章中了解 RxJava 定时器、延迟和间隔运算符。此外,本文将阐明所有不同 Timer、Delays 和 Interval Operators 的用例,因此请保持关注直到最后。通过示例,我们将研究以下所有操作。
- 计时器
- 延误
- 间隔
让我们从 RxJava Timer Operator 开始。当我们想在一定时间后做某事时使用 Timer运算符。
定时器运算符示例
Kotlin
Observable.timer(5, TimeUnit.SECONDS)
.flatMap {
return@flatMap Observable.create { shooter ->
Log.d("gfgArticleExampe", "Shoot")
shooter.onNext("GeeksforGeeks")
shooter.onComplete()
// Action to be done when completed 10 secs
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("gfgArticleExampe", it)
}
Kotlin
Observable.create { emitter ->
Log.d("DelayGFG", "Shoot")
emitter.onNext("GeeksforGeeks")
emitter.onComplete()
}
.subscribeOn(Schedulers.io())
.delay(10, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("DelayGFG", it)
}
Kotlin
val disposable =
Observable.interval(1, 10, TimeUnit.SECONDS)
.flatMap {
return@flatMap Observable.create { shooter ->
Log.d("GfGInterval", "Shoot")
shooter.onNext("GeeksforGeeks")
shooter.onComplete()
}
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("GfGInterval", it)
}
compositeDisposable.add(disposable)
上面的例子向我们展示了我们所说的计时器运算符。当我们将 10 秒传递给 Timer运算符,它将以这种方式移动到另一个任务,我们在 10 秒内完成任务并发出值“GeeksforGeeks”。
GeekTip #1: When we have a use-case where we wish to complete a job after a certain amount of time, we may use the Timer Operator.
现在,让我们看看RxJava 延迟运算符。延迟算子将来自 Observable 的排放提前指定的数量。让我们看一个 Delay运算符的例子。
延迟运算符示例
科特林
Observable.create { emitter ->
Log.d("DelayGFG", "Shoot")
emitter.onNext("GeeksforGeeks")
emitter.onComplete()
}
.subscribeOn(Schedulers.io())
.delay(10, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("DelayGFG", it)
}
我们正在做一些工作,然后发出一个值,但我们想将值的发送推迟到订阅者,因此我们使用了延迟运算符。
Geek Tip #2: When we have a use-case where we wish to execute the work first and then postpone the emission for a specific amount of time, we may use the Delay Operator.
让我们来看看 RxJava 间隔运算符,它生成一个 Observable,它发出由时间间隔分隔的整数序列。
区间运算符示例
科特林
val disposable =
Observable.interval(1, 10, TimeUnit.SECONDS)
.flatMap {
return@flatMap Observable.create { shooter ->
Log.d("GfGInterval", "Shoot")
shooter.onNext("GeeksforGeeks")
shooter.onComplete()
}
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("GfGInterval", it)
}
compositeDisposable.add(disposable)
在这种情况下,任务将在 10 秒延迟后重复。要记住的一件事:它将无限期地继续下去。
那么如何摆脱这个循环呢?
那么,有两种方法可以停止:
- 使用compositeDisposable。
- dispose()可以使用 take(n)运算符调用。
结论
当我们有一个用例时,我们希望以特定的时间间隔重复一项工作,我们可以使用间隔运算符。要记住的另一件事是所有 Timer、Delay 和 Interval Operators 都在调度程序线程上运行,因此我们不必担心它。为了解决这个有趣的问题,我们可能会使用 RxJava 定时器、延迟和间隔运算符。