2012-09-22 112 views
2

我已經構建了一個Android聊天應用程序。它有一個通過使用Socket連接到的TCP服務器。後臺服務器方法

我希望服務器連接在後臺始終工作 - 即使應用程序不在前臺 - 並監聽從服務器發送的數據。

現在我正在使用while循環來檢查是否有新的東西,但是當Android需要資源時OS關閉了我的線程。

我想過在我的線程中使用readline()方法,而不是使用while循環,因爲readline()是一種阻塞方法。

這是正確的方法,這將導致防止操作系統殺死我的應用程序?

有沒有什麼辦法,像一個自定義的廣播接收器,只有當傳入的套接字可用時纔會啓動?

謝謝!

回答

1

簡而言之,Android可以並且將會殺死任何佔用資源以保持運行的應用程序。 onus關於如何處理可能威脅你的應用程序被殺死的場景。

我建議看看developer的網站上發現的服務的生命週期。

首先,任何應用程序,無論是服務/活動,這種方式太多了,以這種方式被認爲... ...在Android的眼中「粗魯」,因此,準備在這個死亡方式不管!

例如,在onLowMemory中監聽覆蓋方法,並相應地採取行動,例如保存數據和缺陷。

真正,應該發生,是這樣的,服務,產生一個線程來定期監聽以這種方式傳入連接,

while (!terminating){ 
    Socket incomingClientSocket = ourServerSocket.accept(); 
    // How you handle this part is up to you? 
    Thread.sleep(500); // Sleep for 500 ms 
} 

terminating變量是一個boolean,是決定變量它控制何時終止循環。請注意0​​方法如何被用來「冷靜」執行,如果省略,Android會在應用程序中放置一個十字線並終止它,換句話說,要對系統資源有禮貌。

提示:擴展Thread類,以保持的經accept()方法處理傳入的連接的功能。

incomingClientSocket變爲非空,那麼另一個線程被創建在其中打開incomingClientSocket的輸入/輸出流和讀/寫使用二進制時尚它。

不要使用readline方法,因爲這表示設計不佳,並且假設數據是文本的,因爲到客戶端的一個傳入數據包可能是例如720bytes,之後進入的下一個數據包可能會以及564字節,這是TCP/IP的性質。

您需要想出一個更可靠的方法來建立數據傳輸的邊界,例如開始和結束標記,並讓服務器讀取傳入數據並區分組成開始和結束的字節流,結束標記,一旦兩者都存在,然後提取標記之間的實際數據並相應地對其執行操作。

例如,您可以在incomingClientSocket實際上變爲非null,向您的活動發送一個廣播以對其執行操作,然後讓該活動接受該套接字並打開連接並讀/寫/來自與套接字關聯的輸入/輸出流。

+0

你的解釋很棒,真的教會了我很多!它是否有所作爲,如果我是我的應用程序只是一個套接字而不是套接字服務器?我不接受連接 - 只是連接和發送和接收數據 –

+0

同樣的事情適用不管:) – t0mm13b

+0

謝謝!我正在努力:) –