- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Android 平台上使用开源的 libDispatch (GCD)。因此,大多数复杂的耗时任务都是通过 NDK 完成的(我在其中使用 libDispatch)。
对于某些调用,我正在使用 dispatch_async(get_main_queue)...这就是问题所在...我能够在并发队列中运行任务,但不能在主队列中运行。因为这需要调用 dispatch_main() ,我们不能在这里做,因为在这种情况下 Java 线程将被阻塞。那么,是否可以在某个辅助线程上运行 Java UI 并 Hook dispatch_main() 以在此处为 dispatch_main_queue 提供服务?或者:我是否需要通过 JNI 从 JAva 主 UI 线程继续为 main_queue 提供服务?
最佳答案
查看 _dispatch_main_queue_callback_4CF
,这是您可以调用以耗尽主队列的函数。它会在执行排队操作后像正常的明智函数一样返回,而不是像 dispatch_main
那样杀死线程。
请注意,您需要定期从 Java UI 线程调用 _dispatch_main_queue_callback_4CF
,可能是每次迭代。官方 Cocoa 实现使用 _dispatch_queue_wakeup_main()
,它使用 mach 消息将主线程踢出任何 sleep 状态,因此它可以保证快速调用回调函数,但您必须做一些工作才能启用它并构建您自己的 libDispatch 端口。实际上,在 Android 上,我不认为主 UI 线程会在您的应用程序处于 Activity 状态时进入休眠状态,因此这应该不是问题。
在 libDispatch 站点上有一个开放的工单,地址是 https://libdispatch.macosforge.org/trac/ticket/38使 _dispatch_main_queue_callback_4CF
成为公共(public)函数。票证标记为“已接受”,但没有说明是否/何时会发生。
关于android - 在 Android 上没有 dispatch_main 的 libDispatch 服务于主队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18916567/
我是一名优秀的程序员,十分优秀!