android - 如何避免与 2 个可观察订阅者的竞争条件?
问题描述
我试图在我的应用程序的几个不同位置实现 1 observable 的一致调用。所以,我写了一些例子,我不能成功地做到这一点。
private fun runTest() {
val rs1 = requestResponse("rs1")
val rs2 = requestResponse("rs2")
//This works as should, but I can't create chains
//rs1.flatMap { rs2 }.repeat(5).subscribeBy()
//This is not working
rs1.repeat(5).subscribeBy()
rs2.repeat(5).subscribeBy()
}
private fun requestResponse(title: String): Single<Unit> =
doRequest(title)
.flatMap { readResponse(title) }
private fun doRequest(title: String): Single<Unit> {
return Single
.just(Unit)
.doOnSuccess { Log.d("TEST", "$title --->") }
.delay(Random.nextLong(500), TimeUnit.MILLISECONDS)
}
private fun readResponse(title: String): Single<Unit> {
return Single
.just(Unit)
.doOnSuccess { Log.d("TEST", "$title <---") }
.delay(Random.nextLong(500), TimeUnit.MILLISECONDS)
}
所以,我尝试使用share
运算符并requestResponse
返回ConnectableObservable
,但它无论如何都不起作用
我尝试使用Schedulers.single()
调度程序在单线程中完成工作并实现队列。
因此,我希望在日志中看到结果。它适用于flatMap
:
rs1 --->
rs1 <---
rs2 --->
rs2 <---
...
rs1 --->
rs1 <---
rs2 --->
rs2 <---
但我看到
rs2 --->
rs1 --->
rs1 <---
rs2 <---
...
rs2 --->
rs1 --->
rs2 <---
rs1 <---
解决方案
rs1.repeat(5).blockingSubscribe()
rs2.repeat(5).blockingSubscribe()