2012-02-09 4 views
5

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

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

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

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

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

Спасибо!

+4

Почтовый код, связанный с выпуском. – kosa

+1

@thinksteep попытается задуматься над предложением, приведенным ниже, чтобы увидеть, могу ли я что-нибудь сделать. Я избегаю публикации фрагмента кода здесь в виде более чем 500 строк кода. Благодаря! – Deva

ответ

6

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

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

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

+0

Спасибо Mattc за ответ, я проведу проверку возможного состояния гонки. (Надеюсь, я смогу его найти.) Будет обновлен. – Deva

+1

Благодаря @Mattc это было состояние гонки, которое это делало. К счастью, он смог найти причину. Действительно хорошее обучение. – Deva

+0

Рад, что вы его нашли. Резьбовая логика печально известна и сложна для отладки. – MattC

10

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

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

+0

Если только могут быть два предпочтительных ответа. Я понятия не имею, сколько времени вы спасли меня с этим ответом, но это очень много времени! –

Смежные вопросы