如何使用RxJava阻止返回直到计时器到期

时间:2018-07-25 20:33:32

标签: rx-java2

我看不到扫描返回任何信息。我知道是因为mutableList立即返回,但是如何阻止返回直到时间到期?

基本上,我要做的就是在take()允许的时间内填充可变列表,然后将该可变列表返回给调用函数。

这是我尝试过的。

docker-compose.yml

}

1 个答案:

答案 0 :(得分:0)

好,这是为下一个想要做这种事情的人做的。在Rx中,它们具有Singles,它们是仅发出一个值的Observables。就我而言,我需要一个String值列表,因此只需要使用String类型的List类型的Single即可。那只会发出一个恰好是字符串列表的元素。代码看起来像这样...

fun returnAllDevicesStartingWith(devicePrefix: String): Single<List<String>> {
return  scanForDevices()
   .take(3, TimeUnit.SECONDS, timeoutScheduler)
   .map { it.bleDevice.name }
   .filter { it.startsWith(devicePrefix) }
   .toList()
}

调用它的函数(用Java而不是Kotlin编写)如下:

List<String> devices = bleUtility.returnAllDevicesStartingWith(prefix).blockingGet();

我使用像这样的模拟函数对其进行了测试:

    //Begin test code
var emittedList: List<String> = listOf("dev1-1", "dev1-2", "dev2-1", "dev2-2", "dev3-1", "dev3-2")

private fun scanForRoomDevices(): Observable<FoundDevice> = Observable
        .intervalRange(0, emittedList.size.toLong(), 0, 1, TimeUnit.SECONDS, timeoutScheduler)
        .map { index -> FoundDevice(emittedList[index.toInt()], BleDevice(emittedList[index.toInt()])) }

data class FoundDevice(val controllerId: String, val bleDevice: BleDevice)
data class BleDevice(val name: String)

希望这对其他人有帮助。