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

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

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

В итоге я решил проблему, просто поместив вызов showDialog() в оператор try, но мне нужно более сложное решение, так как это кажется неправильным способом делать что-то.


person moonlightcheese    schedule 06.06.2011    source источник


Ответы (2)


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

person CommonsWare    schedule 06.06.2011
comment
это требует, чтобы я полностью переписал свою обработку сообщений, но это было ожидаемо. - person moonlightcheese; 08.06.2011

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

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

person Alex Gitelman    schedule 07.06.2011