2011-09-20 50 views
1

我正在设计一个需要定期更新服务器的应用程序,但我不确定如何去发送这些更新。将消息发布到服务器的设计建议

这就是我想要做的:
当我的活动开始时,我必须发送一个初始连接消息到服务器。连接建立后,我会每秒向服务器发送一条新消息。当用户执行服务器需要了解的某些操作时,该消息将被添加到队列中。每隔一秒左右,我的应用程序就会检查队列中是否发送消息。如果有一个可用,它将被发送。如果队列为空,则应发送简单的Keep Alive消息来维护连接。

我的问题是,对我来说实施这个最好的策略是什么?我应该使用单独的线程吗?还是服务?还是AsyncTasks?

我的想法至今:连接不需要保持过去 活动的生命周期,所以在我看来,服务将 是矫枉过正。

我应该如何处理调度更新?我应该使用Looper使用MessageQueue吗?或者一个ScheduledExecutorService?还是一个处理程序?

我的想法至今: 我的理解是的MessageQueue块,直到它接收 消息发送。 我不确定这是我想要的。我的计划是在队列为空时发送Keep 活动消息 ,而不是阻塞,直到有新消息到达。

我对这类东西完全陌生,所以我可能会用完全错误的方式来解决这个问题。我很乐意听到您可以提供的任何建议。

+1

如果你有20000个用户,那么每一秒都会显得有点多,那就是每秒20000次点击。 – Jack

+0

对于大多数应用程序来说这肯定会成为问题,但我不认为这是我的情况。服务器位于机器人上,一次只能有几个用户连接到它。另外,如果在几秒钟内没有收到消息,连接就会终止,所以我不得不经常发送消息。 – theisenp

+0

我会用那个Arduino – Merlin

回答

1

我会用一个单独的线程与睡眠声明(或Android当量)...保持它尽可能简单,必须与你的预期时序和事实,即应用程序不适用于无人参与的执行

+0

我不知道为什么我没有想到这一点。我的头顶听起来像是应该符合我的需求。我会测试它并报告回来,谢谢Merlin。 – theisenp

+0

这似乎对我来说工作得非常好,感谢Merlin的简单解决方案! – theisenp

1

几点说明:

  1. 请记住用户:确保这不会产生太多的流量。应用程序未处于活动状态时,应取消通信。

  2. 当手机进入睡眠状态时,没有网络通信。

  3. 您不应该在UI线程上发送/接收数据。所有你说的都可以:后台线程,服务和AsyncTask。

  4. 如果您只有一个活动更新然后使用AsyncTask,因为它是最简单的。当Activity恢复时,通知comm任务停止。

  5. 如果您需要更新不同的活动,请使用服务。当收到一些数据并且感兴趣的活动可以注册这些事件时,服务应该发送广播。这是优雅的,因为只有活动(在前景)活动接收广播。