我在Android平台上使用libDispatch(GCD)opensource。 因此,大多数复杂耗时的任务都是通过NDK完成的(我使用的是libDispatch)。
对于某些调用,我使用的是dispatch_async(get_main_queue)...这就是问题的来源...... 我能够在并发队列中运行任务,但不能在主队列上运行。 因为这需要调用dispatch_main(),我们不能在这里调用,因为在这种情况下将阻塞Java线程。 那么,是否可以在某个辅助线程上运行Java UI并挂钩dispatch_main()以在此处为dispatch_main_queue提供服务? 或者:我是否需要继续通过JNI从JAva主UI线程提供main_queue?
答案 0 :(得分:1)
查看_dispatch_main_queue_callback_4CF
哪个函数可以调用以排空主队列。在执行排队操作后,它将像普通的敏感函数一样返回,而不是像dispatch_main
一样杀死线程。
请注意,您需要定期从Java UI线程调用_dispatch_main_queue_callback_4CF
,可能每次迭代。官方Cocoa实现使用_dispatch_queue_wakeup_main()
,它使用mach消息将主线程从任何睡眠状态中踢出,这样可以保证快速调用回调函数,但是你必须做一些工作来启用它和构建自己的libDispatch端口。实际上在Android上我不认为主要的UI线程会在您的应用处于活动状态时进入睡眠状态,因此它不应该是一个问题。
在https://libdispatch.macosforge.org/trac/ticket/38的libDispatch网站上打开了一张故障单,以使_dispatch_main_queue_callback_4CF
成为公共功能。机票标有"接受"但没有关于是否/何时会发生的消息。