#android #multithreading #message-queue #handler #android-service
#Android #многопоточность #очередь сообщений #обработчик #android-сервис
Вопрос:
Я пробую большую программу с фоновой службой и реализую (довольно плохо продуманную) процедуру обработки сообщений, используя базовые объекты-обработчики. Приложение имеет главное меню с кнопками, которые запускают 6 различных действий.
Проблема заключается в следующем: если я запускаю рабочий поток, который запускает запрос к базе данных и извлекает некоторые данные, и я закрываю действие, которое запустило вышеупомянутый рабочий поток, обработчик в действии все еще пытается запустить и показать диалоговое окно, даже если действие, которое его создало, теперь завершено (или не в фокусе). Как я могу определить, находится ли текущая активность в фокусе, прежде чем вносить какие-либо изменения в пользовательский интерфейс?
В итоге я решил проблему, просто поместив вызов ‘ShowDialog ()’ в инструкцию try, но мне хотелось бы более сложное решение, поскольку это просто кажется неправильным способом выполнения действий.
Ответ №1:
Используйте sendBroadcast()
, Activity
зарегистрировав BroadcastReceiver
для широковещательной рассылки через registerReceiver()
в onResume()
и дерегистрировав его в onPause()
. Затем он будет обрабатывать событие только в том случае, если оно находится на переднем плане.
Комментарии:
1. это требует, чтобы я полностью переписал свою обработку сообщений, но это было ожидаемо.
Ответ №2:
Установите некоторый флаг в onPause()
методе activity, который запускает поток, чтобы указать, что он больше не находится на переднем плане. В onStart()
измените флаг на противоположный.
Когда придет время отображать диалоговое окно, установите этот флаг и показывайте диалоговое окно только в том случае, если выполняется действие.