Я пишу приложение, которое по сути является оберткой вокруг 250K JNI. JNI (игровой движок) имеет API-интерфейсы, такие как handle_penUp (int x, int y). Иногда требуется запросить пользователя изнутри handle_penUp () (посредством обратных вызовов в код Java), поэтому диалоговое окно, которое я использую для реализации запроса, должно блокироваться.
Я понимаю, что основной поток выполнения не может блокироваться. Итак, я создал второй поток, который выполняет все вызовы JNI, которые могут привести к обратным вызовам, которые необходимо будет заблокировать. Внутри этого второго потока, когда мне нужно открыть диалоговое окно блокировки, я вызываю startActivityForResult (), а затем acqu () на семафор. Когда onActivityResult () вызывается в главном потоке, он вызывает release () для того же семафора.
Это работает, если мой запрос реализован как новое действие, но не если я хочу показатьDialog () в существующем действии. Сообщения в журнале говорят мне, что моей теме нужен Looper. Я добавляю один - и добавлю информацию о том, работает ли он - но мне кажется, что я иду по неверному пути здесь. Что мне нужно, так это рецепт блокирования диалогов (полезен хотя бы потому, что они есть у любой другой платформы, и поэтому перенесенный код будет часто работать таким образом.)