несколько обработчиков для потока пользовательского интерфейса - PullRequest
1 голос
/ 19 июня 2020

Согласно документации :

Все объекты Handler для определенного потока получают одно и то же сообщение.

Однако в этом коде:

Handler h1 = new Handler(Looper.getMainLooper());
Handler h2 = new Handler(Looper.getMainLooper());
h1.post(runnable1);
h2.post(runnable2);
h1.removeCallbacksAndMessages(null);

runnable2 выполняется, хотя все обратные вызовы были удалены для h1.

Кроме того, h1.equals(h2) возвращает false.

Если приложение использует только один Handler для основного потока?

1 Ответ

1 голос
/ 19 июня 2020

Итак, для h1.equals(h2), возвращающего false, объяснение очень простое - Handler класс не переопределяет equals, поэтому они сравниваются по идентичности, а h1 и h2 - два разных объектов, он возвращает false.

Относительно того, почему выполняется runnable2: у этих двух обработчиков один и тот же базовый лупер, и поэтому у них одинаковая основная очередь сообщений. Публикация runnable внутренне ставит в очередь сообщение с Runnable, которое вы отправили в Handler, и этот Handler в качестве цели для этого сообщения.

Когда вы вызываете removeCallbacksAndMessages(null), Handler запрашивает очередь сообщений, чтобы удалить все сообщения, которые являются целью. Итак, в вашем случае в очереди будет два сообщения: 1) Сообщение, которое будет запускать runnable1 и целевое h1 2) Сообщение, которое будет запускать runnable2 и целевое h2

И, таким образом, когда вы звоните h2.removeCallbacksAndMessages(null), очередь сообщений удалит только сообщения, которые были отправлены из h2.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...