2013-03-12 5 views
0

Могу ли я создать более одного объекта-обработчика для потока с помощью петлителя? Предположим, я создал два новых объекта Handlerh1 и h2, связанные с UIThread's Looper. h1 вывешивает Messagem1 и h2 вывешивает m2 к Looper .does в UIThread в h1.handleMessage() и h2.handleMessage() процесса m1 и m2, соответственно, так что другие события, связанные с UI, такие как штрихи обрабатываются соответствующими обработчиками ??Темы обработчика Android

ответ

1

Целью HandlerThread является создание Нити с ее Looper.

Могу ли я создать более одного объекта-обработчика для потока с петлителем?

Да, несколько обработчиков могут использовать тот же Looper и MessageQueue.

так, чтобы другие связанные с UI события, такие как касания, обрабатывались их соответствующими обработчиками?

Хотя я смущен тем, что вы пытаетесь задать здесь, я знаю, что только основной поток может получить доступ к объектам пользовательского интерфейса.

+0

Только один вопрос, прежде чем я расскажу, что я имел в виду под моим последним высказыванием. Итак, h1.handleMessage() обрабатывает сообщения, отправленные h1 на петлитель? – tez

+0

Правильно, 'h1' обрабатывает сообщения или Runnable, предназначенные для' h1'. Я не верю, что у него есть доступ к любым сообщениям для 'h2'. – Sam

+0

Я не понимаю, что вы подразумеваете под «доступом к любым сообщениям для h2». Вы имеете в виду, что h1.handleMessage() не имеет никакого доступа к m2? И что я имел в виду под «другими событиями, связанными с UI, такими как касания обработанные их соответствующими обработчиками », я думаю, что любые события, такие как касания, клики на пользовательском интерфейсе, помещают сообщение/runnable в Looper, и их обработчики будут обрабатывать их. Это только моя спекуляция. Не знаю как верно – tez

0

Я думаю, что ответ Сэма не получает.

вопрос: если у меня есть 2 или более обработчиков, который создается в том же потоке, или с тем же петлителя в качестве параметра конструктора в следующем коде:

Handler h1 = new Handler(Looper.mylooper()) {//override handleMessage, if receiving messageA then do actionA};

Handler h2 = new Handler(Looper.mylooper()) {//override handleMessage, if receiving messageA then do actionB}

то я делаю это: h2.sendMsg(messageA), какой обработчик обработает сообщение?

Мой ответ Handler h2, каждое сообщение будет обрабатываться только один раз обработчиком выбранного атрибута сообщения target, по умолчанию, который посылает который обрабатывает. В вашем вопросе h1.handleMessage() и h2.handleMessage() выполняйте процесс m1 и m2 соответственно, чтобы другие связанные с UI события, такие как касания, обрабатывались их соответствующими обработчиками.

Мы можем погрузиться в исходный код Handler, и обнаружили, что все метод sendMessage будет прыгать в следующем:

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { 
    msg.target = this; // Note this! 
    ... 
    return queue.enqueueMessage(msg, uptimeMillis); 
} 

Когда нити Looper собирается принять сообщение из очереди, то будет отправлять сообщение в соответствии с атрибутом Message «s target:

msg.target.dispatchMessage(msg);//decides which handler to process. This code is in Looper.loop() 

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

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