2011-03-24 2 views
15

Je développe cette application et j'ai besoin à un moment donné d'envoyer des données (doubles et chaînes pour la plupart) à un serveur. Je vais utiliser TCP socket et DataOutput/InputStreams. Je me demandais quelle serait la meilleure façon de faire cela. Dois-je avoir une classe séparée pour gérer la connexion avec les méthodes write/read implémentées ou peut-être simplement définir Sockets/Streams etc dans ma classe d'activité principale dans onCreate()? La première voie est-elle encore possible? Tous les exemples seraient appréciés.bonne façon d'utiliser les sockets dans l'application Android

ps. Dois-je utiliser un autre thread pour gérer la connexion?

modifier.
Donc, si je l'ai eu droit, cela devrait être correct:

public class ConnectionHandler extends AsyncTask<Void, Void, Void>{ 

public static String serverip = "192.168.1.100"; 
public static int serverport = 7777; 
Socket s; 
public DataInputStream dis; 
public DataOutputStream dos; 
public int message; 

@Override 
protected Void doInBackground(Void... params) { 

    try { 
     Log.i("AsyncTank", "doInBackgoung: Creating Socket"); 
     s = new Socket(serverip, serverport); 
    } catch (Exception e) { 
     Log.i("AsyncTank", "doInBackgoung: Cannot create Socket"); 
    } 
    if (s.isConnected()) { 
     try { 
      dis = (DataInputStream) s.getInputStream(); 
      dos = (DataOutputStream) s.getOutputStream(); 
      Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned"); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected"); 
      e.printStackTrace(); 
     } 
    } else { 
     Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed"); 
    } 
    return null; 
} 

public void writeToStream(double lat, double lon) { 
    try { 
     if (s.isConnected()){ 
      Log.i("AsynkTask", "writeToStream : Writing lat, lon"); 
      dos.writeDouble(lat); 
      dos.writeDouble(lon); 
     } else { 
      Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed"); 
     } 
    } catch (Exception e) { 
     Log.i("AsynkTask", "writeToStream : Writing failed"); 
    } 
} 

public int readFromStream() { 
    try { 
     if (s.isConnected()) { 
      Log.i("AsynkTask", "readFromStream : Reading message"); 
      message = dis.readInt(); 
     } else { 
      Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed"); 
     } 
    } catch (Exception e) { 
     Log.i("AsynkTask", "readFromStream : Writing failed"); 
    } 
    return message; 
} 

} 

et j'utiliser quelque chose comme ça dans ma classe d'activité:

ConnectionHandler conhandler = new ConnectionHandler(); 
    conhandler.execute(); 
    conhandler.writeToStream(lat , lon); 

Répondre

16

Depuis les connexions réseau peut prendre du temps et rendre votre application ne répond pas si elle est effectuée sur le thread UI, vous devez probablement les faire dans un AsyncTask. Si votre AsyncTask est suffisamment complexe, il peut être intéressant de l'implémenter dans son propre fichier java en tant que classe publique.

This answer vous donnerait le squelette de base. AsyncTask, il est facile d'interagir avec l'interface utilisateur au début et à la fin de votre chargement en arrière-plan, si vous avez besoin d'afficher une indication de progression.

Thread a tendance à être un plus mauvais choix que vous êtes toujours à gauche avec le problème de l'interaction de l'interface utilisateur lorsque votre thread termine ainsi que de faire en sorte que le fil ne continue pas son travail après la fin de votre activité; un AsyncTask peut également être annulé et onCancelled sera exécuté au lieu de onPostExecute.

+1

Ah génial je pensais plus de filetage traditionnel, je regarderai plus dans AsyncTask et sera de retour si j'ai des questions. Merci. – kotsosh

+1

Je viens aussi de trouver cet exemple pour toute personne intéressée: http://stackoverflow.com/questions/5135438/example-android-bi-directional-network-socket-using-asynctask – kotsosh