我正在尝试轮询分页API,并在新项目出现时向用户提供这些项目。
以下是示例用法:
我认为这条消息的意思是我只能在SequenceBuilder中使用挂起函数:
现在,每当API被轮询一次后,我都使用以下方法阻塞序列构建一秒钟:
fun connect(): Sequence<T> = buildSequence {
while (true) {
// result is a List<T>
val result = dataSource.getFirstPage()
yieldAll(/* the new data in `result` */)
// Block the thread for a little bit
}
}
以下是示例用法:
for (item in connect()) {
// do something as each item is made available
}
我的第一个想法是使用delay
函数,但是我收到了这个消息:
受限制的挂起函数只能在其受限制的协程范围内调用成员或扩展的挂起函数。
这是buildSequence
的签名:
public fun <T> buildSequence(builderAction: suspend SequenceBuilder<T>.() -> Unit): Sequence<T>
我认为这条消息的意思是我只能在SequenceBuilder中使用挂起函数:
yield
和yieldAll
,而任意调用挂起函数是不允许的。现在,每当API被轮询一次后,我都使用以下方法阻塞序列构建一秒钟:
val resumeTime = System.nanoTime() + TimeUnit.SECONDS.toNanos(1)
while (resumeTime > System.nanoTime()) {
// do nothing
}
这个方法能够运行,但似乎并不是个好的解决方案。有人之前遇到过这个问题吗?
buildSequence
只能同步延迟执行:由于协程是由迭代器运行的,它总是期望一个适当的序列元素来挂起并将其作为迭代器的下一个项返回。这就是为什么它会RestrictsSuspension
的原因。另一个问题是,您使用主动等待而不是阻塞线程。 - hotkey