Правильный способ сделать это - модель программы, управляемая событиями, т.е. «не звоните нам, мы вам позвоним».
В простом программировании в консольном режиме ваш код имеет тенденцию вызывать блокировкуфункции ввода, которые не возвращаются, пока вы не получили значение.
Многие среды программирования графического интерфейса работают по-разному - ваш код обычно не выполняется, но вместо этого он вызывается операционной системой / оконным менеджером, когда происходит что-то интересное.Вы делаете что-то в ответ на это и немедленно возвращаетесь - если вы этого не сделаете, вы не сможете получать уведомления ни о чем другом, поскольку ОС не имеет возможности связаться с вами, пока вы не вернетесь.(По сравнению с win32 это выглядит так, как будто цикл сообщений реализован в Android, и вам остается только написать остальную часть кода, который цикл сообщений вызывает с событиями - если вы не вернетесь быстро, цикл сообщений зависнет)
В результате вам необходимо переосмыслить концепцию потока программ.Вместо того, чтобы писать список дел в виде простой серии утверждений, думайте о нем как о последовательности действий, которые зависят друг от друга и от ввода.Помните, какое действие вы выполняете в настоящее время в переменной состояния.Когда вас вызывают с таким событием, как пользовательский ввод, посмотрите, означает ли это событие, что теперь возможно перейти к следующему шагу, и, если это так, обновите переменную состояния, прежде чем быстро вернуться к ОС, чтобы иметь возможность получить следующийсобытие.Если событие было не тем, что вам нужно, просто вернитесь без обновления своего состояния.
Если эта модель не работает для вас, вы можете написать фоновый поток программной логики, который работает какприложение в режиме консоли, использующее блокирующий ввод.Но ваши функции ввода будут просто ждать флага или чего-то еще, чтобы получить уведомление о доступности ввода.Затем в потоке пользовательского интерфейса, где Android доставляет события, вы обновляете флаг и сразу возвращаетесь.Фоновый поток видит, что флаг был изменен, чтобы указать, что данные были предоставлены, и продолжает выполнение.(Что-то вроде эмулятора терминала Android доводит это до крайности, когда фоновый компонент фактически является другим процессом - Linux-режим консольного режима, и он получает свой ввод с помощью потенциально блокирующего ввода-вывода из каналов. Компонент java принимает события пользовательского интерфейса Android ивставляет символы в канал stdin и вытаскивает их из канала stdout для отображения на экране.)