2009-05-14 8 views
1

J'ai lu dans de nombreux endroits que la connexion réseau dans une application j2me doit être effectuée dans un thread séparé. Est-ce une nécessité ou un bien à avoir?j2me connexion réseau

Je demande cela parce que je ne pouvais trouver nulle part écrit que cela doit être fait dans un fil séparé. En outre, lorsque j'ai écrit une application simple pour aller chercher une image sur un réseau et l'afficher à l'écran (sans utiliser de fil de discussion), cela n'a pas fonctionné. Quand j'ai changé le même pour utiliser un fil séparé cela a fonctionné. Je ne suis pas sûr si cela a fonctionné juste parce que je l'ai changé en fil séparé, comme j'avais fait beaucoup d'autres changements au code aussi.

Quelqu'un peut-il confirmer s'il vous plaît?

Edit: Si en cours d'exécution dans un thread séparé n'est pas une nécessité, quelqu'un peut-il s'il vous plaît me dire pourquoi le morceau de code ci-dessous simple ne fonctionne pas?

Il arrive à un stade où l'émulateur demande "Est-il correct de se connecter au réseau". Indépendamment du fait que j'appuie sur "oui" ou "non", l'écran ne change pas.

 

public class Moo extends MIDlet { 

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException { 
     // TODO Auto-generated method stub 

    } 

    protected void pauseApp() { 
    } 

    protected void startApp() throws MIDletStateChangeException { 
     Display display = Display.getDisplay(this); 
     MyCanvas myCanvas = new MyCanvas(); 
     display.setCurrent(myCanvas); 
     myCanvas.repaint(); 

    } 

    class MyCanvas extends Canvas { 

     protected void paint(Graphics graphics) { 
      try { 
       Image bgImage = Image.createImage(getWidth(), getHeight()); 

       HttpConnection httpConnection = (HttpConnection) Connector 
         .open("https://stackoverflow.com/content/img/so/logo.png"); 
       Image image = Image.createImage(httpConnection 
         .openInputStream()); 
       bgImage.getGraphics().drawImage(image, 0, 0, 0); 
       httpConnection.close(); 

       graphics.drawImage(bgImage, 0, 0, 0); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

} 

 

Modifier: J'ai eu ma réponse pour le code here.

Modifier: J'ai engendré une question distincte de ce here.

Répondre

2

Le problème est que vous essayez de travailler dans le thread responsable de l'exécution de l'interface utilisateur. Si vous n'utilisez pas un thread séparé, ce thread d'interface utilisateur attend pendant que vous faites votre travail et ne peut pas traiter vos autres mises à jour de l'interface utilisateur! donc oui vous ne devriez vraiment pas faire un travail important dans les gestionnaires d'événements puisque vous devez y retourner rapidement le contrôle.

0

Je suis d'accord avec Sean, mais il n'est pas nécessaire d'avoir votre connexion réseau dans un thread séparé, juste une bonne pratique. Je pense que c'est probablement une coïncidence que la connexion a fonctionné correctement après l'avoir déplacée vers un thread séparé. Quoi qu'il en soit, si vous voulez fournir un retour visuel à l'utilisateur pendant la connexion (ce que vous faites probablement compte tenu de la disparité de temps que les utilisateurs peuvent rencontrer sur un réseau mobile), vous devriez avoir le traitement en réseau dans un fil séparé .

0

Il n'est pas obligatoire de faire des connexions réseau dans un nouveau sujet, mais dans la pratique vous constaterez que c'est toujours une bonne idée de le faire puisque les activités réseau peuvent bloquer et laisser votre application dans un état de non-réponse.

Ceci est un old article, mais il parle de certains des problèmes liés au réseautage et à l'expérience utilisateur.