在我的应用中,我需要进行多次TCP套接字调用。
为了能够做到这一点,我必须执行以下步骤: 1.将我的数据/命令转换为字节流 2.创建套接字并发送命令并接收响应 3.解析响应和存储以供UI使用。
现在我已经创建了一个后台线程来完成所有这三个步骤。
但是在我的socket客户端中我也想为每个新命令创建一个新线程(步骤#2) 这意味着我在公共工作线程中有很多工作线程用于上述所有三个步骤。
那么,对于已经在工作线程中发生的步骤#2使用异步任务是否可以。或者在这种情况下我使用普通线程。
有人可能想知道为什么我没有在一个工作线程中实现所有三个步骤。 关键是即使我只为所有套接字命令创建一个工作线程,步骤1的初始请求可能本身来自工作线程。
因此,我不能只假设调用来自主UI线程。 另外,我想问一下是不是不建议在android中创建自己的工作线程,为什么?
谢谢, 晴天
答案 0 :(得分: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可能是最有效的方法。
祝你好运。答案 1 :(得分:0)
形成您的前两个段落我明白您想通过套接字建立一些通信。我不相信这是一个很好的方法来创建每个命令的线程作为线程本身和打开/关闭套接字是昂贵的操作。 我建议只创建一个线程来打开和监视/写入/从socket读取数据。如果这些命令频繁而不是维持一个套接字存活则比频繁打开/关闭套接字更合适。我可以选择创建一个额外的线程,用于执行序列化/反序列化命令的额外工作(如果它们非常耗时)。
有人可能想知道为什么我没有在一个工作线程中实现所有三个步骤。关键是即使我只为所有套接字命令创建一个工作线程,步骤1的初始请求可能本身来自工作线程。
我不认为这会对您的设计方法产生重大影响。
因此,我不能只假设调用来自主UI线程。另外,我想问一下是不是不建议在android中创建自己的工作线程,为什么?
Android为一般用途提供了一些非常好的泛型类,如AsyncTask和HandlerThread,但如果上述那些不符合设计要求,任何人都可以自由创建工作线程。我个人创建自己的工作线程,如果我处理套接字编程。
我建议看看Java NIO库特别是Selectors和SocketChannel类