我正在创建一个Android应用,其中一个用户将能够在地图上看到另一个用户。
这是事情
有一个Web服务,客户端请求Web服务中的所有登录用户然后将用户呈现为地图上的标记。每隔几秒钟后再次提出请求
我让客户端弄清楚并且正在工作。
问题在于服务器端。 我这样做的方式是:
有效。但我知道不是这样做的。
以下是问题所在:
如何改进服务器逻辑?
答案 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发送所有位置更新。