libDispatch обслуживает основную очередь без dispatch_main на Android
Я использую libDispatch (GCD) с открытым исходным кодом на платформе Android. Итак, большинство сложных трудоемких задач выполняется через NDK (где я использую libDispatch).
Для некоторых вызовов я использую dispatch_async(get_main_queue)... Это то, где проблема прибывает... Я могу запускать задачи в параллельных очередях, но не в основной очереди. Так как это требует вызова dispatch_main(), что мы не можем сделать здесь, так как поток Java в этом случае будет заблокирован. Итак, возможно ли запустить пользовательский интерфейс Java в каком-то дополнительном потоке и подключить dispatch_main() для обслуживания dispatch_main_queue здесь? ИЛИ: Нужно ли продолжать обслуживать main_queue из основного потока пользовательского интерфейса JAva через JNI?
1 ответ
Заглянуть в _dispatch_main_queue_callback_4CF
это функция, которую вы можете вызвать для опустошения основной очереди. Он вернется, как нормальная разумная функция после выполнения операций в очереди, вместо того, чтобы убить поток, как dispatch_main
,
Обратите внимание, что вам нужно позвонить _dispatch_main_queue_callback_4CF
на регулярной основе из вашего потока пользовательского интерфейса Java, возможно, на каждой итерации. Официальная реализация Какао использует _dispatch_queue_wakeup_main()
который использует сообщения mach, чтобы вывести основной поток из любых состояний сна, чтобы гарантировать быстрый вызов функции обратного вызова, но вам придется проделать определенную работу, чтобы включить это и создать свой собственный порт libDispatch. В реальности на Android я не думаю, что основной поток пользовательского интерфейса когда-либо усыпляется, когда ваше приложение активно, поэтому это не должно быть проблемой.
На сайте libDispatch по адресу https://libdispatch.macosforge.org/trac/ticket/38 открыт билет, чтобы сделать _dispatch_main_queue_callback_4CF
публичная функция. Билет помечен как "Принят", но ни слова, если / когда это произойдет.