【发布时间】:2013-08-20 15:57:32
【问题描述】:
我正在构建一个 Android 应用程序,只要该应用程序正在运行,它就会定期与服务器通信。
我通过在应用程序启动时启动与服务器的连接来做到这一点,然后我有一个单独的thread 用于接收名为ReceiverThread 的消息,这个thread 从socket 读取消息,分析它,并将其转发到应用程序的适当部分。
这个thread 在一个循环中运行,读取它必须读取的任何内容,然后阻塞read() 命令直到新数据到达,因此它大部分时间都被阻塞了。
我通过另一个线程处理发送消息,称为SenderThread。我想知道的是:我应该以类似的方式构建SenderThread 吗?意思是我应该为这个线程维护某种形式的队列,让它发送队列中的所有消息然后阻塞直到新消息进入队列,或者我应该在每次需要发送消息时启动一个新的线程实例,让它发送消息然后“死”?我倾向于第一种方法,但我不知道在性能(将阻塞线程保留在内存中与初始化新线程)和代码正确性方面实际上哪个更好。
此外,由于我的所有活动都需要能够发送和接收消息,因此我在 Application 类中持有对两个线程的引用,这是一种可接受的方法还是我应该以不同的方式实现它?
我遇到的一个问题是,有时如果我关闭我的应用程序并再次运行它,我实际上有两个 ReceiverThread 实例,所以我收到了两次消息。
我猜这是因为我的应用程序实际上并没有关闭并且前一个线程仍然处于活动状态(在read() 操作中被阻塞),当我再次打开应用程序时,一个新线程被初始化,但两者都已连接到服务器,因此服务器将消息发送给两者。有关如何解决此问题或如何完全重新组织它以使其正确的任何提示?
我尝试查找这些问题,但在我的第一个问题中发现了一些相互矛盾的示例,没有任何有用且适用于我的第二个问题的示例...
【问题讨论】:
-
“关闭”应用程序实际上并没有杀死它。它只是保持运行,尤其是线程不会自动停止
-
@zapl 是的,我知道,这是我的问题。问题是:如何可靠地停止线程?或者如何以避免此问题的方式实现相同的整体应用程序?
-
这确实很棘手。
Thread#interrupt()(+Socket#close()) 可用于停止它,但困难的部分是跟踪应用程序是否正在运行或只是在后台空闲。例如,每个活动都可以从onStart到onStop执行此操作。
标签: java android client-server