我正在构建一个 android 应用程序,只要该应用程序正在运行,它就会定期与服务器通信。
我通过在应用程序启动时启动与服务器的连接来做到这一点,然后我有一个单独thread
的用于接收名为的消息ReceiverThread
,它thread
从 中读取消息socket
,对其进行分析,并将其转发到应用程序的适当部分。
这thread
在一个循环中运行,读取它必须读取的任何内容,然后阻塞read()
命令直到新数据到达,所以它大部分时间都被阻塞了。
我通过另一个线程处理发送消息,称为SenderThread
. 我想知道的是:我应该SenderThread
以类似的方式构建吗?意思是我应该为这个线程维护某种形式的队列,让它发送队列中的所有消息然后阻塞直到新消息进入队列,或者我应该在每次需要发送消息时启动一个新的线程实例,让它发送消息然后“死”?我倾向于第一种方法,但我不知道在性能(将阻塞线程保留在内存中与初始化新线程)和代码正确性方面实际上更好。
此外,由于我的所有活动都需要能够发送和接收消息,因此我在Application
课堂上持有对两个线程的引用,这是一种可接受的方法还是我应该以不同的方式实现它?
我遇到的一个问题是,有时如果我关闭我的应用程序并再次运行它,我实际上有两个 ReceiverThread 实例,所以我收到了两次消息。
我猜这是因为我的应用程序实际上并没有关闭并且前一个线程仍然处于活动状态(在read()
操作中被阻塞),当我再次打开应用程序时,一个新线程被初始化,但两者都连接到服务器所以服务器将消息发送给双方。有关如何解决此问题或如何完全重新组织它以使其正确的任何提示?
我尝试查找这些问题,但在我的第一个问题中发现了一些相互矛盾的示例,并且没有任何有用且适用于我的第二个问题的示例......