2

我一直在我的 Android 项目中大量使用协程。例如,我使用它们将阻塞调用和 CPU 密集型任务移交给线程池。这是launch(UI)完美的工作:它确保继续在 UI 线程上恢复。

我还在使用协程来处理诸如等待第一次onDraw调用、使用 a 恢复动画循环postOnAnimate()等。在这些情况下,UI 上下文无法满足我的需要,因为它通过向事件提交项目来异步恢复继续循环,即使cont.resume()在 UI 线程上调用。

onDraw在我等待第一次调用 an的情况下,这变得特别糟糕ImageView:我必须根据现在已知的视图尺寸重新定位图像。但是,由于协程异步恢复,onDraw()完成,然后再运行几次,然后我的协程才会恢复。用户体验闪烁,因为不正确定位的图像短暂出现。

是否有一个选项可以强制 UI 调度程序cont.resume()在 UI 线程上调用时立即恢复?

4

1 回答 1

1

是的。您可以在此处awaitFrame研究Adroind 上下文中的实现并使用类似的技术。特别是,当协程被函数挂起时,如果您已经在此调度程序的上下文中运行,则可以通过使用结果中的函数来要求恢复它调度。您必须提供对相应调度程序的引用作为“证明”并使用以下代码模式:suspendCancellableCoroutineresumeUndispatchedCancellableContinuation

with(continuation) { dispatcher.resumeUndispatched(value) }

从某种意义上说,这种方法是安全的,如果您正在恢复的协程使用不同的调度程序,那么它仍将被调度到适当的调度程序。只有在您指定的调度程序中运行时,调度才会被抑制。

于 2018-03-21T19:51:25.627 回答