Как постоянно проверять, завершен ли выполняемый обработчик?
Как Android-код может определить, когда завершен работающий процесс обработчика? В этом конкретном приложении не генерируются никакие другие события, кроме обработчика, завершающего свою работу.
Просто положить while()
цикл вокруг непрерывного теста глобального логического флага не работает:
... stuff to do before the handler's runnable is started
while (globalBooleanFlagStatingThatRunnableIsNotYetFinished)
Thread.sleep(5);
... stuff to do only after the handler's runnable is finished, like process data
С использованием while()
При таком подходе кажется, что выполнение останавливается на точку с запятой до тех пор, пока ОС не выдвинет принудительное закрытие, независимо от того, насколько успешно выполняется runnable для установки указанного логического флага.
Как другие обнаружили завершение работоспособного процесса?
2 ответа
Ваш цикл while загружает все процессорное время, поэтому больше ничего, например сообщения пользовательского интерфейса, не успевает обработать.
Обычное исправление - короткий Sleep()
внутри петли. Это приводит к вызову ядра, позволяющему ему некоторое время запускать другие биты задачи.
Другие операции ввода / вывода, такие как консоль, печатают / читают файл, также делают это.
Тот факт, что вы заняты ожиданием или даже ожиданием, указывает на то, что в философии дизайна вашего приложения может быть что-то не так. Как правило, если вы чего-то ждете, то вместо этого вам следует запускать действие как ответ на какой-то обработчик. Например, в этом случае вы можете просто иметь возможность обрабатывать onClick
событие. В случае, если вы ждете этого в ветке, почему? Вместо этого убейте поток, оставьте некоторое состояние вокруг (с помощью конечного автомата, реализуя продолжение), и, когда вызывается onClick, запустите новую задачу для выполнения остальной части работы.
По сути, я не уверен, что куплю, что вам действительно нужно ждать здесь, вместо этого вы должны использовать обработчик.
РЕДАКТИРОВАТЬ: вид программирования, который вы ищете, не представляется возможным в основной теме приложения. Вместо этого вы должны использовать AsyncTask
где вы выполняете работу в задаче (т. е. регулярно включаете и выключаете вспышку) или Службу, которая порождает поток. В любом случае вам следует ознакомиться с потоками Android, ваша проблема, скорее всего, связана с тем, что вы пытаетесь использовать основной поток для длительных операций. И да, это возможно, но я бы не назвал это "программированием в реальном времени", это просто проблема с многопоточностью.