为Android应用程序创建服务器端,每隔几秒发出一次请求

时间:2014-11-18 09:05:21

标签: android web-services server

我正在创建一个Android应用,其中一个用户将能够在地图上看到另一个用户。

这是事情
有一个Web服务,客户端请求Web服务中的所有登录用户然后将用户呈现为地图上的标记。每隔几秒钟后再次提出请求 我让客户端弄清楚并且正在工作。

问题在于服务器端。 我这样做的方式是:

  • Web服务接收客户端请求并将客户端lat-lng保存在数据库中
  • 从数据库中检索其他活动用户并将其发送回客户端。

有效。但我知道不是这样做的。

以下是问题所在:

  • 客户端每5秒调用一次Web服务,因此Web服务必须每秒更新数据库中的客户端位置。( BAD
  • 如果有100个用户,那么Web服务必须每5秒进行100次更新。(非常糟糕

如何改进服务器逻辑?

2 个答案:

答案 0 :(得分:2)

您必须创建一个新线程,以便在呼叫时间超过预期时,呼叫不会锁定设备。 AsyncTask是一种使用多线程的简单方法,但它缺乏重复任务的功能。我会说你最好使用Timer或更新的ScheduledExecutorService。如果您选择使用Timer,则可以创建一个可以交给它的TimerTask。 ScheduledExecutorService改为使用Runnable。

您可能希望将该线程包装在一个服务中(该服务不提供新的线程),但根据您的需要,这并不总是必要的。

根据建议,您还可以使用Handler.postDelayed()。虽然您仍然需要创建一个新线程,然后在其上调用Looper.prepare():

类LooperThread扩展Thread {       public Handler mHandler;

  public void run() {
      Looper.prepare();

      mHandler = new Handler() {
          public void handleMessage(Message msg) {
              // process incoming messages here
          }
      };

      Looper.loop();
  }

} (来自Looper docs的代码)

也;每5秒调用一次web服务似乎太频繁了,特别是如果用户连接速度很慢或者有需要传输的数据,请尝试尽可能减少呼叫。

答案 1 :(得分:0)

使用Google Cloud Messaging服务。每5秒请求一个坏主意,也会耗尽电池。只需要在服务器之间更新更改。所以推送通知是正确的方式。

在您的示例中 - 并非所有100个用户位置都将每5秒更改一次。同样将变化标准化 - (可以忽略几米内的少量变化 - 无需通知客户)

如果您通过轮询机制,服务器可以使用一个其他API发送所有位置更新。