Почему продолжают приходить сообщения в уничтоженный Handler?

Есть Messenger и Handler, в который принимаются сообщения.
private class IncomingHandler extends Handler {
	@Override
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
	}
}

private IncomingHandler incomingHandler = new IncomingHandler();
private Messenger mMessenger = new Messenger(incomingHandler);


Через вызов bindService устанавливается связь с сервисом (успешно). Отправляется сообщение сервису, в его replyTo указывается mMessenger. Сервис возвращает ответ и он приходит в handleMessage. До сюда всё работает как и должно.

Отключаюсь от сервиса через unbindService. Сервис присылает ещё одно сообщение и оно почему-то опять принимается Handler-ом. Отвязываю его от кэлбеков, уничтожаю его и Messenger.
mMessenger = null;
incomingHandler.removeCallbacksAndMessages(null);
incomingHandler = null;


Сервис отправляет очередное сообщение и оно опять принимается handleMessage в то время, когда incomingHandler, переданный Messenger-у и он сам в null. Я предполагал, что после отключения от сервиса, отправка из него сообщения вывалится в исключение. Как такое возможно и что надо сделать, чтобы сообщения перестали доходить?
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Хэндлеры не завязаны на жизненный цикл сервисов, в т.ч. и на bind/unbind. В доках пишут, что "Remove any pending posts of callbacks and sent messages". Про будущие ничего не сказано.
Отвязываю его от кэлбеков, уничтожаю его и Messenger.
mMessenger = null;
incomingHandler.removeCallbacksAndMessages(null);
incomingHandler = null;
Обнуление ссылок на Messenger и Handler, это, конечно же, не удаление объектов. Объекты прекрасно себе продолжают жить, им приходят сообщения и т.д. Другое дело, что у вас какие-то траблы с жизненным циклом сервиса - после того, как все клиенты от него отвязались (unbindService), он должен завершиться и больше ничего не посылать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы