2011-11-14 3 views
2

Je voudrais savoir s'il est possible de créer un écouteur pour un auditeur. Par exemple, si j'ai un écouteur pour un bouton, puis-je créer un écouteur pour cet écouteur de telle sorte qu'une fois que le bouton est pressé l'écouteur du bouton écouteur serait notifié. Mon autre problème est que si j'ai un appel de fonction qui a des écouteurs à l'intérieur, ces écouteurs seront détruits au retour de l'appel de fonction. Par exemple, puis-je avoir une fonction que j'appelle au début du programme et qui a des écouteurs pour les auditeurs de mon programme principal?comment les écouteurs de java fonctionnent

+2

Pourquoi auriez-vous besoin d'un écouteur pour un écouteur? Vous ne pouvez pas appeler une méthode lorsque l'écouteur de bouton est averti? – Tudor

+0

Maintenant, je ne suis normalement pas du genre à me demander "pourquoi le faire comme ça" puisque je suppose que les gens ont leurs bonnes raisons, mais ... pourquoi est-ce comme ça? Pourquoi ne pas faire le travail nécessaire dans le premier écouteur, ou avoir plusieurs écouteurs sur le bouton, ou avoir une liste de "gestionnaires" dans l'auditeur? –

+0

fondamentalement je voudrais faire est d'ajouter un pot ou une classe au projet, puis juste initialiser une fois au début afin de minimiser les changements de la souce de l'application elle-même –

Répondre

2

Bien sûr, vous pouvez. Les auditeurs, ou le "modèle d'observateur", sont assez simples. Tout ce que fait le pattern observateur est d'utiliser des interfaces pour créer un "contrat" ​​qui permet à tout le monde de savoir qu'une certaine classe implémente une certaine méthode pour que vous soyez sûr de pouvoir l'appeler sur cet objet.

Ainsi, par exemple, vous pouvez créer deux interfaces comme celle-ci:

public interface OnClickListener { 
    public void onClick(); 
} 

pubic interface SomeOtherListener { 
    public void onFoo(); 
} 

Le code qui souhaite « déclencher » ces méthodes, doivent avoir une référence à ces auditeurs. Typiquement ceci est fait en exposant une certaine méthode publique pour "placer l'auditeur (s)". Donc, dans une classe, vous auriez public void setOnClickListener() { this.onClickListener = listener; } La classe qui implémente l'écouteur peut maintenant appeler setListener (this). Notez que "this" fonctionne ici car les interfaces en Java vous procurent ce type de polymorphisme. Vous pouvez convertir une classe en une de ses superclasses ou interfaces implémentées. Ainsi, dans la classe qui veut appeler "onClick" par exemple, tout ce qui l'intéresse est que la classe qui contient "onClick" soit un "onClickListener". C'est tout ce qui concerne cette classe. Maintenant, tant que la classe dans laquelle vous implémentez le "onClick" a une référence à SomeOtherListener (en étant préalablement enregistré), onClick peut appeler someOtherListener.onFoo();

Donc, en résumé, conception dans certains cas) vous pouvez techniquement avoir autant d'auditeurs interdépendants que vous le souhaitez, à condition de le configurer de sorte que les objets/classes pertinents aient les références à ces auditeurs dont ils ont besoin. Désolé, c'était un peu déroutant. En outre, il est difficile de fournir une explication plus détaillée sans plus de détails sur ce que vous voulez faire exactement.

EDIT

Au meilleur de ma connaissance, il est impossible de mettre en place une « passe-partout » pour se connecter chaque événement GUI dans une application Android.Puisque les méthodes d'interface sont déclarées comme des méthodes vides qui doivent être implémentées, vous devez spécifier, dans votre implémentation, la journalisation précise que vous souhaitez et aller à partir de là. Vous pouvez certainement pirater la source Android pour enregistrer quelque chose à chaque fois que setOnClickListener est appelé, par exemple, mais je ne peux pas imaginer que ce soit super utile. En outre, implicite dans ceci est que vous devez faire ceci pour chaque type d'écouteur qui est disponible. Seuls les écouteurs que vous implémentez seront disponibles pour toute sorte de journalisation. Si vous n'implémentez pas onTouch, par exemple, il n'y a pas de journalisation à afficher ...

+0

essentiellement ce que j'essaie de faire est de journaliser tous les événements de l'interaction GUI d'une application Android tout en minimisant les changements de code dans la source android. Par exemple, je voudrais ajouter une sorte de jar ou une classe au projet, puis juste l'initialiser avec quelques lignes de code à l'intérieur de l'application Android et après cela, il enregistrerait toutes les interactions d'événements avec l'interface graphique. ce que j'essaie de faire est d'obtenir tous les contrôles de l'interface graphique et de créer les écouteurs de manière dynamique, im essayer de journaliser tous les événements générés à partir de l'interface graphique si vous avez une meilleure façon de le faire s'il vous plaît share.Thanks! –

2

Les auditeurs sont simplement une façon de propager des événements. Normalement, un objet qui notifie les écouteurs a une collection qui contient la liste des écouteurs. Quand il y a un événement, il va simplement et notifie chaque écouteur dans la liste.

Vous pouvez créer un écouteur d'un écouteur. C'est simplement enchaîné. Votre auditeur aura donc une liste d'auditeurs qu'il notifiera.

Les écouteurs résident normalement dans l'objet et non dans un appel de fonction. Ainsi, vous créez normalement un moyen d'ajouter/de supprimer des écouteurs dans l'objet qui avertit les auditeurs.

+0

merci pour la réponse, essentiellement ce que j'essaie de faire est de journaliser tous les événements de l'interaction GUI d'une application Android tout en minimisant les changements de code dans la source android. Par exemple, je voudrais ajouter une sorte de jar ou une classe au projet, puis juste l'initialiser avec quelques lignes de code à l'intérieur de l'application Android et après cela, il enregistrerait toutes les interactions d'événements avec l'interface graphique. Merci! –

+0

Ok, c'est logique. Salutations Sid –

1

Vous pouvez commencer à lire à propos des interfaces + Stratégie (Stratégie) et des modèles de conception de Bridge. Normalement, les écouteurs de java sont implémentés comme une stratégie avec la différence que vous avez plusieurs interfaces au lieu d'une seule. IListener est une interface que vous pouvez implémenter cette interface et enregistrer votre implémentation dans MyClass.

+0

essentiellement ce que j'essaie de faire est de journaliser tous les événements de l'interaction GUI d'une application Android tout en minimisant les changements de code dans la source android. Par exemple, je voudrais ajouter une sorte de jar ou une classe au projet, puis juste l'initialiser avec quelques lignes de code à l'intérieur de l'application Android et après cela, il enregistrerait toutes les interactions d'événements avec l'interface graphique. ce que j'essaie de faire est d'obtenir tous les contrôles de l'interface graphique et de créer les écouteurs de manière dynamique, im essayer de journaliser tous les événements générés à partir de l'interface graphique si vous avez une meilleure façon de le faire s'il vous plaît share.Thanks! –

Questions connexes