2013-07-27 76 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