2014-07-05 43 views
1

在我的应用程序中,我需要进行一些TCP套接字调用。从Android的工作线程内部创建线程

为了能够做到这一点,我必须做以下步骤:1。 我的数据/指令转换成字节流 2.创建套接字,并发送指令和接收响应为 3.解析响应和存储用户界面。

现在我创建了一个后台线程,可以完成所有三个步骤。

但是在我的套接字客户端中,我还想为每个新命令创建一个新线程(步骤#2) 因此,这意味着我在上述三个步骤中的普通工作线程中都有大量工作线程。

因此,对于已经发生在工作线程中的步骤#2使用异步任务是否可行?或者我在这种情况下使用普通线程。

有人可能会问为什么我不能在一个工作线程中实现所有三个步骤。 问题是,即使我为所有套接字命令创建了一个工作线程,第1步的初始请求可能本身也可能来自工作线程。

因此,我不能仅仅假设来自主UI线程的调用。 此外,我想问是否不建议在android中创建自己的工作线程,为什么?

感谢, 阳光

回答

0

形成你的第2段我明白你想通过套接字建立一些沟通。我不认为这是一个很好的方法来创建一个线程每个命令线程本身和开放/关闭套接字是昂贵的操作。 我会建议创建只有一个线程打开和监控/写入/从套接字读取数据。如果这些命令比频繁打开/关闭套接字更频繁地维护一个套接字是比较合适的。可选地,我会创建一个额外的线程来完成序列化/反序列化命令的额外工作(如果它们耗时的话)。

有人可能会问为什么我不能在一个工作线程中实现所有三个步骤。重点在于,即使我为所有套接字命令创建了一个工作线程,第1步的初始请求也有可能来自工作线程。

我不认为这会对您的设计方法产生重大影响,请求来自何处。

因此,我不能仅仅假设来自主UI线程的调用。此外,我想问问是否不建议在android中创建自己的工作线程,为什么?

Android提供了一些非常好的泛型类,例如AsyncTask和HandlerThread用于一般用途,但任何人都可以自由创建工作线程,如果上述不符合设计要求的话。我个人创建自己的工作线程,如果我处理套接字编程。

我建议看看Java NIO库专门选择器和SocketChannel类

0

不能使用的AsyncTask了点。

AsyncTasks只能是instantiated and executed on the UI thread

但是,您可以使用标准线程。

类MyThread的{

@override 
    public void run() { 
      ...... 
      // when needed - span a new working thread fro within old one 
      new MyOtherThread(...).start(); 
    } 

}

没有问题在这里。

如果您觉得您产卵的线程数可能失控,那么使用thread pool是一个聪明的主意。 java.util.concurrent包有几个例如 ThreadPoolExecutor。


最后,我以前也多次给这个建议,如果你的任务 是使用多线程架构来传输大量的小物件,用 Volley可能是最有效的方法走。

祝你好运。