2010-05-04 6 views
4

Я столкнулся с проблемой с нитками и розетками. Я не могу понять это, если кто-то может мне помочь, я бы очень признателен.Розетки, потоки и услуги в android, как заставить их работать вместе?

Есть факты:

У меня есть класс обслуживания NetworkService, в этом классе у меня есть атрибут Socket. Я бы хотел, чтобы он находился в состоянии подключения на весь жизненный цикл службы.

Чтобы соединить сокет, я делаю это в потоке, поэтому, если серверу требуется тайм-аут, он не блокирует мой поток пользовательского интерфейса.

Проблема в том, что в теме, где я подключаю свой сокет, все в порядке, оно подключено, и я могу поговорить с моим сервером, как только этот поток завершен, и я пытаюсь повторно использовать сокет, в другом потоке у меня есть сообщение об ошибке Socket is not connected.

Вопросы: - Разъем автоматически отсоединен в конце резьбы? - Это все равно, мы можем передать значение вызываемого потока вызываемому абоненту?

Спасибо большое,

Вот мой код

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

Вы когда-нибудь это выясняли? У меня та же проблема. – Gourneau

ответ

2

Определение выходного потока в качестве переменной-члена, прикрепить его в потоке, и только закрыть этот поток, когда вы закончите ...

В настоящее время вы открываете (и неявно закрываете) выходной поток в потоке. По мере того как нить замирает, она закрывает этот выходной поток, который, в свою очередь, может убивать сокет/соединение.

Если вы определяете поток за пределами потока, его можно присоединить к потоку и закрыть его позднее, например, когда служба попросит завершить работу.

 Смежные вопросы

  • Нет связанных вопросов^_^