2010-05-13 8 views
2

J'ai plus d'un Handlers dans une activité. Je crée tous les gestionnaires dans le onCreate() de l'activité principale. Ma compréhension est que la méthode handleMessage() de chaque gestionnaire ne sera jamais appelée en même temps car tous les messages sont placés dans la même file d'attente (le thread d'activité MessageQueue). Par conséquent, ils seront exécutés dans l'ordre dans lequel ils sont placés dans la file d'attente. Ils seront également exécutés dans le fil d'activité principal. Est-ce correct ?Android 2.1: Les gestionnaires Muliple dans une seule activité

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); 

} 
}; 
} 
+0

@CommonsWare Quand vous dites « Multipl Les gestionnaires me rendent nerveux ", voulez-vous dire plusieurs gestionnaires par fil unique .. s'il vous plaît clarifier – Nike15

Répondre

2

De la documentation « Lorsque vous créez un nouveau gestionnaire, il est lié à la file d'attente fil/message du fil qui crée il - à partir de ce moment-là, il livrera des messages et runnables à ce message file d'attente et exécutez-les comme ils sortent de la file d'attente de messages. "

Donc, vous avez raison, ils s'exécuteront dans l'ordre où vous les mettez en file d'attente sur le thread d'interface utilisateur (puisque vous allez les créer dans onCreate).

+0

Merci! Donc, je n'ai pas besoin de synchroniser les opérations sur une variable d'instance de l'activité. Cependant, je dois encore 'synchroniser' si le thread _another_ accède à la variable d'instance. –

2

Un message par heure, par thread et par gestionnaire.

  1. Chaque nouvelle instance de Handler (...) est liée, explicitement ou implicitement, à une instance de Looper, et une seule fois.
  2. exemple Looper, est déjà créé quelque part avec Looper.prepare() appellent // habituellement obtenu par Activity.getMainLooper() ou Looper.myLooper()
  3. Looper.prepare() utilise (champ statique) Variable sThreadLocal ThreadLocal avoir une instance de Looper par thread. (Il fonctionne même comme hashMap.put (Thread.getCurrent(), nouveau Looper()))
  4. chaque looper a sa propre MessageQueue privée
  5. tous les cas Looper a sa boucle principale méthode()

    loop(){ 
        while(true){ 
         Message msg = messageQueue.next(); 
         msg.target.dispatchMessage(msg); 
        } 
    } 
    
  6. chaque message a une cible (gestionnaire) est définie et une exception est levée (dans MessageQueue.enqueueMessage()) si ce n'est pas le cas.

  7. depuis gestionnaire ne peut pas être lié à plusieurs arpenteuses est fait de sorte que chaque gestionnaire ne reçoit qu'un seul message à temps et uniquement avec msg.target == gestionnaire

si sendMessage() ou postMessage() fonctionne quelque chose comme ça :

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

donc pile appel, lorsque le message de la poignée, devrait ressembler à ceci:

Looper.myLooper()-> Thread.getCurrent()-> Looper-> MessageQueue.next()-> Message-> Message.target-> Handler-> dispatchMessage()-> handleMessage() 
Questions connexes