2013-07-27 112 views
1

我正在做一個連續從TCP套接字接收數據的項目。 我需要將該數據傳遞給另一個活動,以便我可以執行我的操作。 對於每次傳遞數據都是無用的。 我們可以使用計時器,但他們可能會有一些數據丟失。 我需要一些類似的過程,它應該通過數據在它接收的那一刻不斷地進行。 請建議我這是處理TCP數據的最佳流程。 如果你給我一個例子,我感覺更滿意。如何處理TCP數據?

這是我的TCP連接,並接收代碼

Sockets = new Socket("My IP",Port); 
while (s.isConnected()) { 
in = new BufferedReader(
new InputStreamReader(s.getInputStream())); 
int nRead; 
char[] data = new char[1024 + 1024];   
String decoded = "";      
while ((nRead = in.read(data, 0, data.length)) != -1) { 
decoded = new String(data, 0, nRead); **// This decoded data need to pass to another activity.** 
} 

回答

0

可以使用Handler針對Looper.getMainLooper()有效,反覆後的數據從後臺線程UI線程。

Android培訓頁面的Communicating with the UI Thread部分解釋瞭如何使用Handler。我也寫了a blog post關於Loopers不久前,揭示了他們如何工作。

+0

注意'Handler's有'Message'對象的有限池 - 只有50 IIRC。如果您只使用Handlers進行跨線程繁重通信,則池真的很容易耗盡。我會研究java.concurrent中的'BlockingQueue'和'BlockingDeque'。 – Delyan

+0

@Delyan有趣。我的直覺是,如果你的設置要麼如此迅速地推送消息,要麼處理得太慢以至於這個限制成爲問題,計劃中的某些錯誤,而不是消息隊列的選擇。當然,沒有比這更容易的了,我相信也有例外。假設池大小不是問題,您會使用哪種方法? – Barend

+0

如果您需要*休閒*線程通信,'Handler's和'HandlerThread'就是要走的路。不過,我只是寫了一個應用程序解析傳入的數據流,將每行傳遞給消息,我可以向你保證,在我的Nexus 4上,消息池是瓶頸(這是我發現的原因)。所以,如果你不是太垃圾,那就去處理Handlers(儘管如果你正在做任何處理,就不會在UI線程上使用,而是使用'HandlerThread')。如果你正在從事認真的工作,但又想要很多很多的消息,使用合適的隊列,那麼他們更接近消費者 - 製造商模式。 – Delyan