Android 2.1: несколько обработчиков в одном действии - PullRequest
2 голосов
/ 13 мая 2010

У меня более одного Handlers в Деятельности. Я создаю все обработчики в onCreate() основной деятельности. Насколько я понимаю, метод handleMessage() каждого обработчика никогда не будет вызываться одновременно, потому что все сообщения помещаются в одну очередь (ветка Activity MessageQueue) Следовательно, они будут выполнены в том порядке, в котором они помещены в очередь. Они также будут выполнены в основной теме активности. Это правильно ?

 public void onCreate() {

this.handler1 = new Handler() {
@Override
public void handleMessage(Message msg) {

                            //operation 1 : some operation with instanceVariable1
super.handleMessage(msg);
}
};

this.handler2 = new Handler() {

@Override
public void handleMessage(Message msg) {
                            //Operation 2: some operation with instanceVariable1
super.handleMessage(msg);
}

};

this.handler3 = new Handler() {
@Override
public void handleMessage(Message msg) {
                            //Operation 3: some operation with instanceVariable1
super.handleMessage(msg);

}
};
}

Ответы [ 2 ]

2 голосов
/ 18 июня 2015

Одно сообщение за раз, за ​​каждый поток и за обработчик.

  1. Каждый новый экземпляр Handler (...) привязан, явно или неявно, к экземпляру Looper и только один раз.
  2. Экземпляр Looper, уже где-то создан с помощью вызова Looper.prepare () // обычно получается Activity.getMainLooper () или Looper.myLooper ()
  3. Looper.prepare () использует переменную ThreadLocal sThreadLocal (статическое поле), чтобы иметь один экземпляр Looper на поток. (Он работает так же, как hashMap.put (Thread.getCurrent (), новый Looper ()))
  4. каждый петлитель имеет свое личное сообщениеQueue
  5. каждый экземпляр Looper имеет свой основной метод loop ()

    loop(){
        while(true){
            Message msg = messageQueue.next();
            msg.target.dispatchMessage(msg);
        }
    }
    
  6. для каждого сообщения установлена ​​цель (обработчик), и генерируется исключение (в MessageQueue.enqueueMessage ()), если это не так.

  7. , поскольку Handler не может быть привязан к нескольким Loopers, он делает так, что каждый обработчик получает только одно сообщение за раз и только с msg.target == handler

поэтому sendMessage () или postMessage () работает примерно так:

    handler.post(Message msg){
        Looper.sThreadLocal.get(Thread.getCurrent()).messageQueue.push(msg);
    }

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

Looper.myLooper()-> Thread.getCurrent()-> Looper-> MessageQueue.next()-> Message-> Message.target-> Handler-> dispatchMessage()-> handleMessage()
2 голосов
/ 13 мая 2010

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

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

...