首页 > 解决方案 > 如何避免与 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 <---

标签: androidrx-java2

解决方案


rs1.repeat(5).blockingSubscribe()
rs2.repeat(5).blockingSubscribe()

推荐阅读