Обработка сообщений, неожиданное поведение с рабочими потоками

#android #multithreading #message-queue #handler #android-service

#Android #многопоточность #очередь сообщений #обработчик #android-сервис

Вопрос:

Я пробую большую программу с фоновой службой и реализую (довольно плохо продуманную) процедуру обработки сообщений, используя базовые объекты-обработчики. Приложение имеет главное меню с кнопками, которые запускают 6 различных действий.

Проблема заключается в следующем: если я запускаю рабочий поток, который запускает запрос к базе данных и извлекает некоторые данные, и я закрываю действие, которое запустило вышеупомянутый рабочий поток, обработчик в действии все еще пытается запустить и показать диалоговое окно, даже если действие, которое его создало, теперь завершено (или не в фокусе). Как я могу определить, находится ли текущая активность в фокусе, прежде чем вносить какие-либо изменения в пользовательский интерфейс?

В итоге я решил проблему, просто поместив вызов ‘ShowDialog ()’ в инструкцию try, но мне хотелось бы более сложное решение, поскольку это просто кажется неправильным способом выполнения действий.

Ответ №1:

Используйте sendBroadcast() , Activity зарегистрировав BroadcastReceiver для широковещательной рассылки через registerReceiver() в onResume() и дерегистрировав его в onPause() . Затем он будет обрабатывать событие только в том случае, если оно находится на переднем плане.

Комментарии:

1. это требует, чтобы я полностью переписал свою обработку сообщений, но это было ожидаемо.

Ответ №2:

Установите некоторый флаг в onPause() методе activity, который запускает поток, чтобы указать, что он больше не находится на переднем плане. В onStart() измените флаг на противоположный.

Когда придет время отображать диалоговое окно, установите этот флаг и показывайте диалоговое окно только в том случае, если выполняется действие.