2010-05-04 10 views
4

Je suis confronté à un problème avec les discussions et les prises que je ne peux pas comprendre, si quelqu'un peut m'aider s'il vous plaît je voudrais vraiment apprécier.Sockets, Threads et Services dans Android, comment les faire fonctionner ensemble?

Il y a les faits:

J'ai une classe de service NetworkService, dans cette classe, j'ai un attribut Socket. Je voudrais qu'il soit à l'état de connecté pour l'ensemble du cycle de vie du service.

Pour connecter le socket je le fais dans un thread, donc si le serveur doit expirer, il ne bloquerait pas mon thread d'interface utilisateur. Problème est, dans le fil où je connecte ma socket tout va bien, il est connecté et je peux parler à mon serveur, une fois ce thread est terminé et j'essaie de réutiliser le socket, dans un autre thread, j'ai le message d'erreur Socket is not connected. Les questions sont les suivantes: - La prise est-elle déconnectée automatiquement à la fin du filetage? - Est-ce que de toute façon nous pouvons renvoyer une valeur d'un thread appelé à l'appelant?

Merci beaucoup,

Voici mon code

public class NetworkService extends Service { 

     private Socket mSocket = new Socket(); 


    private void _connectSocket(String addr, int port) { 
     Runnable connect = new connectSocket(this.mSocket, addr, port); 
     new Thread(connect).start(); 

    } 

    private void _authentification() { 
     Runnable auth = new authentification(); 
     new Thread(auth).start(); 
    } 


    private INetwork.Stub mBinder = new INetwork.Stub() { 

     @Override 
     public int doConnect(String addr, int port) throws RemoteException { 
      _connectSocket(addr, port); 
      _authentification(); 
      return 0; 
     } 
    }; 


class connectSocket implements Runnable { 
     String addrSocket; 
     int portSocket; 
     int TIMEOUT=5000; 

     public connectSocket(String addr, int port) { 
      addrSocket = addr; 
      portSocket = port; 
     } 

     @Override 
     public void run() { 

      SocketAddress socketAddress = new InetSocketAddress(addrSocket, portSocket); 
      try { 
       mSocket.connect(socketAddress, TIMEOUT); 
       PrintWriter out = new PrintWriter(mSocket.getOutputStream(), true); 
       out.println("test42"); 
          Log.i("connectSocket()", "Connection Succesful"); 
      } catch (IOException e) { 
       Log.e("connectSocket()", e.getMessage()); 
       e.printStackTrace(); 
      }  
     } 
    } 

    class authentification implements Runnable { 

     private String constructFirstConnectQuery() { 
      String query = "toto"; 
      return query; 
     } 

     @Override 
     public void run() { 
      BufferedReader in; 
      PrintWriter out; 
      String  line = ""; 

      try { 

       in = new BufferedReader(new InputStreamReader(mSocket.getInputStream())); 
       out = new PrintWriter(mSocket.getOutputStream(), true); 
       out.println(constructFirstConnectQuery()); 


       while (mSocket.isConnected()) { 
        line = in.readLine(); 
        Log.e("LINE", "[Current]- " + line); 
       } 
      } 
      catch (IOException e) {e.printStackTrace();} 

     } 
    } 
+0

Avez-vous déjà découvert cela? J'ai le même problème. – Gourneau

Répondre

2

Définir le flux de sortie en tant que variable membre, fixez-le dans votre fil, et seulement fermer ce flux lorsque vous avez terminé ...

Actuellement, vous ouvrez (et fermez implicitement) le flux de sortie dans le thread. Lorsque le thread meurt, il ferme ce flux de sortie, ce qui à son tour peut tuer le socket/la connexion.

Si vous définissez le flux en dehors du thread, vous pouvez l'attacher au thread et le fermer plus tard, par exemple lorsque le service est appelé à se terminer.