3

我在 Android 平台上使用 libDispatch (GCD) 开源。因此,大多数复杂耗时的任务都是通过 NDK 完成的(我使用的是 libDispatch)。

对于某些调用,我使用的是 dispatch_async(get_main_queue)...这就是问题所在...我能够在并发队列中运行任务,但不能在主队列中运行。因为这需要调用 dispatch_main() ,我们不能在这里做,因为在这种情况下 Java 线程将被阻塞。那么,是否可以在某个辅助线程上运行 Java UI 并在此处挂钩 dispatch_main() 来为 dispatch_main_queue 提供服务?或者:我是否需要通过 JNI 继续从 JAva 主 UI 线程提供 main_queue 服务?

4

1 回答 1

1

查看_dispatch_main_queue_callback_4CF您可以调用哪个函数来排空主队列。执行排队操作后,它将像正常的明智函数一样返回,而不是像dispatch_main.

请注意,您需要_dispatch_main_queue_callback_4CF定期从 Java UI 线程调用,可能是每次迭代。官方的 Cocoa 实现使用_dispatch_queue_wakeup_main()mach 消息将主线程踢出任何睡眠状态,因此它可以保证回调函数被快速调用,但是您必须做一些工作来启用它并构建自己的 libDispatch 端口。实际上,在 Android 上,我认为主 UI 线程不会在您的应用程序处于活动状态时进入睡眠状态,因此这应该不是问题。

https://libdispatch.macosforge.org/trac/ticket/38的 libDispatch 站点上打开了一张票,用于_dispatch_main_queue_callback_4CF公开功能。该票被标记为“已接受”,但没有说明是否/何时会发生这种情况。

于 2014-04-27T05:13:39.077 回答