通过示例了解 RxJava Zip 运算符
根据官方 RxJava 文档“Zip 使用给定函数组合多个 Observables 的发射,并根据每个组合的该函数的结果发射单个项目”。 zip运算符使我们能够同时从多个 observable 中获取结果。
假设我们有以下两个网络可观察量: GfGCoursesData – 一个网络可观察量,可生成 Geeks for Geeks 提供的课程列表。 GfGDSA – 一个网络可观察对象,返回 Geeks 数据结构课程的 Geeks 列表
GfFCourses 注意到以下几点:
Kotlin
fun getGfGCoursesData(): Observable> {
return networkService.getGfGCoursesData()
}
Kotlin
fun getGFGDSA(): Observable> {
return networkService.getGFGDSA()
}
Kotlin
class NetworkService {
fun gfgCourses(): Observable> {
return Observable.create> { shooterData ->
if (!shooterData.isDisposed) {
// fetch gfgData from network
val gfgData = fetchUserListFromNetwork()
shooterData.onNext(gfgData)
shooterData.onComplete()
}
}.subscribeOn(Schedulers.io())
}
fun gfgDSA(): Observable> {
return Observable.create> { shooterData ->
if (!shooterData.isDisposed) {
// fetch gfgData from network
val gfgData = fetchUserListFromNetwork()
shooterData.onNext(gfgData)
shooterData.onComplete()
}
}.subscribeOn(Schedulers.io())
}
private fun fetchUserListFromNetwork(): List {
return listOf()
}
}
Kotlin
private fun getTheObserver(): Observer> {
return object : Observer> {
override fun gfgSubscribed(d: Disposable) {
println("gfgSubscribed")
}
override fun onNext(userList: List) {
println("onNext : $userList")
}
override fun onError(e: Throwable) {
println("onError : ${e.message}")
}
override fun onComplete() {
println("onComplete")
}
}
}
Kotlin
private fun CommonCourses(GfGCourses: List,
gfgDSACourses: List): List {
val CommonCourses = ArrayList()
for (gfgDSACourse in gfgDSACourses) {
if (GfGCourses.contains(gfgDSACourse)) {
CommonCourses.add(gfgDSACourse)
}
}
return CommonCourses
}
Kotlin
Observable.zip(
gfgCourses(),
gfgDSACourses(),
BiFunction, List, List> { cricketFans, gfgCourses->
// fetching results at once.
return@BiFunction filterUserWhoLovesBoth(cricketFans, gfgDSA)
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver())
GFGDSA 如下:
科特林
fun getGFGDSA(): Observable> {
return networkService.getGFGDSA()
}
这是我们的 NetworkService:
科特林
class NetworkService {
fun gfgCourses(): Observable> {
return Observable.create> { shooterData ->
if (!shooterData.isDisposed) {
// fetch gfgData from network
val gfgData = fetchUserListFromNetwork()
shooterData.onNext(gfgData)
shooterData.onComplete()
}
}.subscribeOn(Schedulers.io())
}
fun gfgDSA(): Observable> {
return Observable.create> { shooterData ->
if (!shooterData.isDisposed) {
// fetch gfgData from network
val gfgData = fetchUserListFromNetwork()
shooterData.onNext(gfgData)
shooterData.onComplete()
}
}.subscribeOn(Schedulers.io())
}
private fun fetchUserListFromNetwork(): List {
return listOf()
}
}
例如,考虑以下观察者:
科特林
private fun getTheObserver(): Observer> {
return object : Observer> {
override fun gfgSubscribed(d: Disposable) {
println("gfgSubscribed")
}
override fun onNext(userList: List) {
println("onNext : $userList")
}
override fun onError(e: Throwable) {
println("onError : ${e.message}")
}
override fun onComplete() {
println("onComplete")
}
}
}
用于识别共同课程的实用工具。
科特林
private fun CommonCourses(GfGCourses: List,
gfgDSACourses: List): List {
val CommonCourses = ArrayList()
for (gfgDSACourse in gfgDSACourses) {
if (GfGCourses.contains(gfgDSACourse)) {
CommonCourses.add(gfgDSACourse)
}
}
return CommonCourses
}
让我们把它们放在一起,以便更好地理解 zip运算符。
科特林
Observable.zip(
gfgCourses(),
gfgDSACourses(),
BiFunction, List, List> { cricketFans, gfgCourses->
// fetching results at once.
return@BiFunction filterUserWhoLovesBoth(cricketFans, gfgDSA)
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver())
概括
首先,我们发出两个网络请求(同时因为我们使用的是 Zip Operator),然后我们选择 DSA 的课程,它们是主要课程的一部分。通过使用 RxJava Zip运算符压缩两个 observables 来并行执行两个网络调用。当两个 observable 都完成后,我们就得到了两者的结果。我们以这种方式同时获得两个 observables 的结果。
结论与 RxZip 的一些优势
- 如果调度程序被适当地分配给每个可观察对象,则并行运行所有作业。
- 当所有作业完成后,在单个回调中返回所有作业的结果。
- 我们可以利用 RxJava Zip Operator 以这种方式解决这个有趣的问题。
想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!