2012-02-13 124 views
8

我正嘗試創建一個通過套接字與本地服務器進行通信的Android應用程序。通信使用JSON傳遞簡單的命令和字符串中的數據。客戶端應該不斷監聽來自服務器的傳入消息,並在收到新數據時更新用戶界面。Android監聽來自服務器套接字的消息

所以我創建了一個網絡服務,這是一個在後臺運行的綁定服務。從我的活動綁定到服務並接收服務對象的實例。服務對象包含允許我將命令發送到服務器的實例方法。

我的問題是,我如何使我的服務不斷偵聽來自服務器的消息,而不會阻止將消息發送到服務器的可能性?

private Socket socket = null; 
private PrintWriter out = null; 
private BufferedReader in = null; 

private Listener listener; 

private String host = "10.0.1.4"; 
private int port = 3000; 

public NetworkService() 
{ 
    try { 

     if (socket == null) 
     { 
     socket = new Socket(this.host, this.port); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 

     if(listener == null) 
     { 
      listener = new Listener(); 
      Thread thread = new Thread(listener); 
      thread.start(); 
     } 

     } catch (Exception e) { 
      // ... 
     } 
    } 
} 

public class Listener implements Runnable 
{ 

    @Override 
    public void run() { 

     try { 
      String line = null; 

      while((line = in.readLine()) != null) 
       { 
       // Do something. Never gets here 

       } 
      } catch (Exception e) { 
       // ... 
      } 

     } 

    } 
+0

笏你的意思。做ü希望在應用程序正在運行或在特定時間段或當應用程序處於靜音模式(當應用程序正在運行背景)... – Sniper 2012-02-13 10:21:08

+0

好了,我需要的服務是可用來運行這些程序,每當我正在使用應用程序。我需要能夠發送簡單的字符串命令到服務器,我需要能夠從服務器接收數據。 – 2012-02-13 10:26:18

+0

你想獲得的反應形式的服務器,直到您的應用程序的結束或在特定時間段.. – Sniper 2012-02-13 10:32:26

回答

4

您可以在服務中創建一個線程來偵聽服務器。第二個線程用於發送命令。然後,爲了您的服務,您應該創建一個帶有處理程序的主線程。該處理程序將處理來自這兩個線程的消息。

+0

這也是我的第一個念頭。我嘗試在構造函數中爲我的服務啓動一個新的線程,並在輸入流上使用readline進行阻塞,但while循環似乎立即終止。請參閱我的編輯 – 2012-02-13 12:45:26

+0

好吧,刪除所有內容並再次嘗試此方法。現在它可以工作。 – 2012-02-13 13:24:53