Итак, для 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
, но вы хотите отменить только некоторые из них.