我正在构建一个Android应用程序,只要应用程序运行,就会定期与服务器通信。
我是通过在应用程序启动时初始化到服务器的连接,然后拥有一个名为ReceiverThread
的单独线程来接收消息。这个thread
从socket
中读取消息,分析它,并将其转发到应用程序的适当部分。
这个thread
在循环中运行,读取所有需要读取的内容,然后在read()
命令上阻塞,直到有新数据到达,所以它大部分时间都被阻塞了。
我通过另一个名为SenderThread
的线程处理发送消息。我想知道的是:我是否应该以类似的方式结构化SenderThread
?也就是说,我是否应该为该线程维护某种形式的队列,让它发送队列中的所有消息,然后阻塞,直到有新消息进入队列,或者每次需要发送消息时都启动一个新的线程,让它发送消息,然后“死亡”?我倾向于采用第一种方法,但我不知道哪一种方法在性能(在内存中保留被阻塞的线程与初始化新线程)和代码正确性方面更好。
另外,由于我所有的活动都需要能够发送和接收消息,所以我在Application
类中持有对这两个线程的引用,这是可接受的方法吗,还是应该以不同方式实现?
我遇到的一个问题是,有时如果我关闭我的应用程序并重新运行它,我实际上会有两个ReceiverThread的实例,因此我会收到一些消息两次。
我猜这是因为我的应用程序实际上没有关闭,先前的线程仍然活动(在read()
操作上被阻塞),当我再次打开应用程序时,新线程被初始化,但两者都连接到服务器,因此服务器将消息发送给了两个线程。有关如何解决此问题或如何重新组织它以使其正确的任何提示吗?
我尝试查找这些问题,但发现我的第一个问题存在冲突的例子,而且没有有用的内容适用于我的第二个问题...
Thread#interrupt()
(+Socket#close()
)来停止它,但难点在于跟踪应用程序是运行还是仅在后台空闲。例如,每个活动都可以从onStart
到onStop
进行跟踪。 - zapl