Правильный способ получить пользовательский ввод в Android, а затем продолжить выполнение

Я реализую интерпретатор для умеренно простого языка программирования, подобного Pascal/BASIC, в Android. Я закончил синтаксический анализатор, поэтому программы распознаются, загружаются в память и готовы к выполнению. Язык является процедурным, эмулирует ввод/вывод командной строки и, очевидно, не управляется событиями, как Java в Android.

Пример программы может выглядеть так:

FOR i FROM 1 TO 10
    READ Name
    PRINT "User ", i, " name: ", Name
END_LOOP

Будучи относительно новым для Android, я не знал, что диалоги Android асинхронны и, следовательно, не могут прерывать выполнение, как объясняется в десятках подобных вопросов. (1), (2), (3), (4)
Итак, я сначала подумал Я бы реализовал команды READ, показав модальный диалог. Выполнение кода, который включает чтение ввода от пользователя, требует дождаться его завершения, прежде чем переходить к следующей строке кода. Но это не должно быть сделано с диалогом, как было сказано в сообщениях выше.

Я понял, что наиболее «подходящим» способом было бы «сохранить» состояние выполнения всей программы, остановить выполнение, а затем начать выполнение, загрузив последнее состояние, когда пользователь вводит что-то из диалогового окна. Но это кажется невозможным и слишком хлопотным для такой простой задачи. Есть ли более простой способ?

Любые предложения приветствуются.


person mavrosxristoforos    schedule 26.11.2016    source источник


Ответы (1)


Я не знал, что диалоги Android асинхронны и поэтому не могут прерывать выполнение, как объяснялось в десятках подобных вопросов.

Весь пользовательский интерфейс Android является асинхронным.

Сначала я думал, что буду реализовывать команды READ, показывая модальный диалог.

В этом нет ничего принципиально плохого. Однако READ потребуется приостановить выполнение вашего интерпретатора до тех пор, пока пользователь не завершит диалог.

Есть ли более простой способ?

Без подготовки...

Шаг №1: Запустите интерпретатор в фоновом потоке.

Шаг № 2: Пусть ваш код READ вызовет ваш диалог в основном потоке приложения, а затем заблокирует Semaphore, чтобы заблокировать фоновый поток.

Шаг № 3: Сделайте так, чтобы ваш код диалога каким-то образом передал результаты пользовательского ввода вашему интерпретатору, а затем отпустите Semaphore, когда диалог исчезнет.

Шаг № 4: Ваш код интерпретатора продолжается.

person CommonsWare    schedule 26.11.2016
comment
Большое спасибо за ответ. Я постараюсь реализовать это завтра и приму ответ, как только прочитаю свою первую переменную. ;-) - person mavrosxristoforos; 27.11.2016
comment
Я только что это сделал. Спасибо за ваш ответ. Для будущих читателей я сделал следующее: 1. Мой интерпретатор реализовал интерфейс Runnable. 2. Создал Semaphore и передал его в Интерпретаторе. 3. Запустил его в новом потоке, написав new Thread(interpreter).start(); 4. Откройте диалоговое окно, используя Handler(Looper.getMainLooper()).post 5. Дождитесь разрешения от Semaphore до release(). 6 Продолжить - person mavrosxristoforos; 27.11.2016