RxJava 延迟运算符
在本文中,我们将了解 RxJava Defer Operator。根据我们的用例,我们将知道何时使用 Defer运算符。在使用 RxJava Defer Operator 时,我们经常犯错误。让我们直截了当,以免出错。
根据文档:
Defer: wait till the observer subscribes before creating the Observable, and build a new Observable for each observer.
所以,在这种情况下,我们将通过一个例子来了解 RxJava 的 Defer Operator。假设我们有一个GfG 类,如下所示:
Kotlin
class GfG {
var course: String = "DSA"
fun getCourseObservable(): Observable {
return Observable.just(course)
}
fun getCourseDeferObservable(): Observable {
return Observable.defer {
return@defer Observable.just(course)
}
}
}
Kotlin
val course = Gfg()
val courseObservable = course.getCourseObservable()
val courseDeferObservable = course.getCourseDeferObservable()
course.price = "DSA"
courseObservable
.subscribe { brand ->
Log.d("GfGExample", "courseObservable : $course")
}
courseDeferObservable
.subscribe { brand ->
Log.d("GfGExample", "courseDeferObservable : $course")
}
我们在上面描述的 GfG 类中有两个方法:
- getCourseObservable() :这个函数通过使用 Observable.just( couse)简单地返回 Observable
。 - getCourseDeferObservable() :Observable
是通过使用 Observable.just(course) 返回的,但包含在 Observable defer() 中。
现在,让我们测试这两种方法,看看会发生什么。
科特林
val course = Gfg()
val courseObservable = course.getCourseObservable()
val courseDeferObservable = course.getCourseDeferObservable()
course.price = "DSA"
courseObservable
.subscribe { brand ->
Log.d("GfGExample", "courseObservable : $course")
}
courseDeferObservable
.subscribe { brand ->
Log.d("GfGExample", "courseDeferObservable : $course")
}
首先,我们要制作价格对象。然后,使用价格对象,我们同时使用 getCourseObservable 和 getCourseDeferObservable 方法来检索可观察值。然后我们将课程的商标指定为“DSA”。之后,我们订阅两个 observables 以确定课程的价格
上述代码的输出:
GfGExample: courseObservable : DEFAULT
GfGExample: courseDeferObservable : DSA
在这里,我们可以看到 courseObservable 接收“DEFAULT”作为课程名称,而 courseDeferObservable 接收“DSA”作为课程名称。因为没有使用 defer运算符,所以 courseObservable 返回旧值“DEFAULT”。因为使用了 defer运算符,所以 courseDeferObservable 返回最新的值“DSA”。它表明 Defer 不会生成 Observable,直到观察者订阅并且每个观察者收到一个新的 Observable。
结论
有两个关键点需要记住:
- 在观察者订阅之前不会创建 Observable。
- 对于每个观察者,Defer 会生成一个新的观察者。
因此,我们可以利用 RxJava Defer Operator 来解决这个有趣的问题。希望这篇文章能帮助你理解这个话题!