我看不到扫描返回任何信息。我知道是因为mutableList立即返回,但是如何阻止返回直到时间到期?
基本上,我要做的就是在take()允许的时间内填充可变列表,然后将该可变列表返回给调用函数。
这是我尝试过的。
docker-compose.yml
}
答案 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)
希望这对其他人有帮助。