handler.post (runnable) не всегда выполняет метод run в Android - PullRequest
5 голосов
/ 09 февраля 2012

Я создал экземпляр Handler в основном потоке пользовательского интерфейса (mUIHandler) и в рабочем потоке (другом потоке), когда я пытаюсь выполнить метод runnable, метод run выполняется почти 9 из 10 раз, нобывает, что 1 раз он не выполняется.

mUIHandler.post (uiRunnable) -> не всегда ли гарантирует выполнение метода run, представленного в runnable?

Я даже добавил методы журналов для проверки и мог видеть, что журналы до вызова метода post выполняются, но журналы методов запуска не отображаются.

Как работает post (runnable)внутри?это гарантирует, что поток пользовательского интерфейса (поток с обработчиком) извинит это, как только пост будет вызван?

Любая помощь будет оценена.

Спасибо!

Ответы [ 2 ]

11 голосов
/ 23 марта 2012

Я столкнулся с этой проблемой и на Android 2.2, в моем случае и Runnables, и Messages использовались с одним и тем же обработчиком.

После просмотра исходного кода обработчика выясняется, что удаление сообщений со значением «что», равным 0, также удаляет все Runnables, находящиеся в очереди. Это происходит потому, что в классе Handler Runnable публикуется внутри как сообщение со значением «чем», равным нулю, и все они удаляются при любом вызове removeMessages(0). Поэтому избегайте использования нуля в качестве идентификатора сообщения.

6 голосов
/ 09 февраля 2012

Я никогда не видел, чтобы обработчик не запускал должным образом опубликованный исполняемый файл. Некоторые вещи для расследования:

  1. Существует ли какая-либо логика, которая может привести к состоянию состязания между данными, с которыми потенциально может взаимодействовать поток, пока выполняется исполняемый поток пользовательского интерфейса?
  2. Есть ли у вас попытка / уловка где-нибудь, кто может молча съесть исключение?

Мой голос (не видя ваш код), что это, вероятно, # 1. Вы не будете первым, кто станет жертвой трудных для отслеживания условий гонки в результате одновременной логики.

...