1

在我的应用程序中,我需要进行一些 TCP 套接字调用。

为此,我必须执行以下步骤: 1. 将我的数据/命令转换为字节流 2. 创建套接字并发送命令并接收响应 3. 解析响应并存储以供 UI 使用。

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

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

那么,是否可以将异步任务用于已在工作线程中进行的步骤 #2。还是在这种情况下我使用普通线程。

有人可能想知道为什么我没有在一个工作线程中完成所有三个步骤。关键是即使我只为所有套接字命令创建一个工作线程,步骤 1 的初始请求本身也可能来自工作线程。

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

谢谢,阳光

4

2 回答 2

0

您不能为此使用 AsyncTask。

AsyncTasks 只能在 UI 线程上实例化和执行

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

类我的线程 {

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

}

这里没有问题。

如果您觉得您正在生成的线程数可能会失控,那么使用线程池是一个聪明的主意。java.util.concurrent 包有几个,例如ThreadPoolExecutor。


最后,我已经多次给出这个建议,如果你的任务是使用多线程架构传输大量的小对象,那么使用Volley可能是最有效的方法。

祝你好运。

于 2014-07-05T12:42:51.707 回答
0

形成你的前 2 段,我知道你想通过套接字建立一些通信。我不相信这是为每个命令创建一个线程的好方法,因为线程本身和打开/关闭套接字是昂贵的操作。我建议只创建一个线程来打开和监视/写入/读取数据到/从套接字。如果这些命令比保持一个套接字活动频繁比频繁打开/关闭套接字更合适。可选地,我会创建一个额外的线程来执行序列化/反序列化命令的额外工作(如果它们很耗时)。

有人可能想知道为什么我没有在一个工作线程中完成所有三个步骤。关键是即使我只为所有套接字命令创建一个工作线程,步骤 1 的初始请求本身也可能来自工作线程。

我认为这不会对您的请求来源的设计方法产生很大影响。

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

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

我建议看一下 Java NIO 库,特别是 Selectors 和 SocketChannel 类

于 2014-07-05T13:06:45.640 回答