2009-08-05 9 views
0

Je travaille sur une application Bluetooth J2ME et l'une des classes recherche d'autres périphériques Bluetooth. Il le fait dans un autre thread, de sorte que l'interface graphique ne gèle pas.Message passant à fil de travail asynchronus en Java J2ME

Le problème que j'ai est de savoir comment passer des messages au thread. Je peux lui demander de chercher, ou annuler la recherche, et il peut dire à l'interface graphique qu'il a trouvé d'autres appareils. Actuellement j'utilise notifier et attendre, mais cela semble être un hack. Ce que je veux vraiment, c'est un moyen d'appeler notify avec un paramètre, par exemple ce que je veux qu'il fasse. Est-ce qu'il y a un moyen de faire ça?

+0

Pouvez-vous poster tout extrait de code de ce que vous essayez de le faire? – Ram

+0

On dirait que le modèle Observer peut être utilisé ici. Vérifiez si c'est possible en j2me. –

Répondre

2

L'approche générale de ce genre de situation doit être la suivante:

  1. découpler la source à distance des données avec le « View ».
  2. Assurez-vous que la vue peut être mise à jour dynamiquement lorsque les données sous-jacentes changent. Les composants J2ME le font par défaut - mais si vous créez vos propres composants, vous devez en tenir compte.
  3. Exécutez un thread séparé et récupérez des données.
  4. Notifier la vue à chaque fois que les données arrivent.

Le code de travail pour le MIDlet est affiché ci-dessous

import javax.microedition.lcdui.Command; 
import javax.microedition.lcdui.CommandListener; 
import javax.microedition.lcdui.Display; 
import javax.microedition.lcdui.Displayable; 
import javax.microedition.lcdui.List; 
import javax.microedition.midlet.*; 


public class AsyncUI extends MIDlet implements SearchListener, CommandListener{ 
    Command CANCEL = new Command("STOP SEARCH",Command.CANCEL,1); 
    Command EXIT = new Command("EXIT",Command.EXIT,2); 
    SearchDevices finder = new SearchDevices(); 
    List deviceList = new List("List of Devices",List.IMPLICIT); 

    public void startApp() { 
     Display d = Display.getDisplay(this); 
     finder.setSearchListener(this); 
     deviceList.addCommand(CANCEL); 
     deviceList.addCommand(EXIT); 
     deviceList.setCommandListener(this); 
     d.setCurrent(deviceList); 
     new Thread(finder).start(); 
    } 

    public void pauseApp() { 
    } 

    public void destroyApp(boolean unconditional) { 
    } 

    public void found(Device d){ 
     deviceList.append(d.getName(), null); 
    } 
    public void commandAction(Command c, Displayable d){ 

     if(c == CANCEL){ 
      finder.cancel(); 
      deviceList.removeCommand(CANCEL); 
     }else if(c== EXIT){ 
      finder.cancel(); /* Cleanup all resources before you quit*/ 
      notifyDestroyed(); 
     } 
    } 
} 

class SearchDevices implements Runnable{ 

    private boolean keepFinding=true; 
    private static final int LONG_TIME=10000; /* 10 Seconds */ 
    SearchListener l =null; /* Currently only one listener. There could be many*/ 

    public void run(){ 
     int i =0; 
     System.out.println(" -- Started the activity of finding --"); 
     while(keepFinding){ 
      try { 
       Thread.currentThread().sleep(LONG_TIME); 
       Device d = new Device("Device Found "+i); 
       i++; 
       System.out.println(" -- Found the device --"); 
       l.found(d); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 
     System.out.println(" -- No more devices will be found --"); 
    } 

    public void cancel(){ keepFinding = false; } 
    public void setSearchListener(SearchListener l){this.l=l;} 


} 

    class Device{ 
     String name; 
     public Device(String name){ this.name = name; } 
     public String getName(){ return name ; } 
    } 

    interface SearchListener{ 
     public void found(Device device); 
    } 
1

Vous devrez implémenter votre propre file d'attente de blocage, il s'agit en fait d'un problème producer-consumer. Une fois que vous avez une file d'attente de blocage, vous pouvez facilement insérer des poussées dans la file d'attente dans leurs propres méthodes, ce qui donne l'impression de faire des appels asynchrones au thread de travail.