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 публичная функция. Билет помечен как "Принят", но ни слова, если / когда это произойдет.

Другие вопросы по тегам