ça n'a rien de très compliqué, il suffit d'essayé de comprendre comme ça se passe avec les listeners habituel.
tu définie une interface "NetworkListener" qui possède une méthode, disons "networkEvent" avec en paramètre un objet contenant ce que tu veux transmettre à l'autre thread (soyons fou, disons que tu reçois directement des String, comme ça pas besoin de se créer un objet spécial pour l'exemple).
ton thread de lecture du socket va avoir cette gueule dans le run :
Code :
- while(this.active) {
- String s = (String) monSocket.read ();
-
- if(s != null)
- this.fireNetworkEvent (s);
- }
|
aux détails prés, je me souviens plus très bien comme on utlise les sockets (et doit y avoir un try catch à faire pour read pour capter les déco réseaux ou des trucs de ce genre).
ensuite, tu as la méthode fireNetworkEvent qui va se charger de lancer tout les event vers les listeners
Code :
- private void fireNetworkEvent (String event) {
- for(NetworkListener client : this.myListeners)
- new ThreadNetworkEvent (client, event).start ();
- }
|
avec
Code :
- public class ThreadNetworkEvent extends Thread {
- private final NetworkListener myClient;
- private final String myEvent;
- public ThreadNetworkEvent (NetworkListener client, String event) {
- this.myclient = client;
- this.myEvent = event;
- }
- public void run () {
- this.myClient.networkEvent (this.myEvent);
- }
- }
|
cette class pouvant très bien être déclaré directement dans ton thread de lecture
le must étant d'éxécuter fireNetworkEvent aussi dans un thread pour éviter de trop bloquer le thread de lecture.
enfin, pour enregistrer tes listeners :
Code :
- private Collection<NetworkListener> myListeners;
- public addNetworkListener (NetworkListener client) {
- this.myListeners.add(client);
- }
|
je te laisse le choix dans la création de la collection (la plus banale suffira)
Ensuite, tu implémente ton NetworkListener comme tu le ferais avec un listener normal.
Et évidemment, comme tout autre listener, garde à l'esprit que ta méthode appelée dans ton listener par le thread de lecture est éxécuté dans un thread à part, et donc si tu as divisé ton appli en 2 thread au début, un qui lit le réseau, et l'autre qui fait le reste, et bien tu n'es pas dans le thread qui s'occupe de l'appli et tu dois donc gérer la synchronisation si ton "networkEvent (String)" doit modifier qqlch dans le reste de l'appli.