我正在进行套接字编程。每当用户触摸屏幕时,触摸位置就会发送到我的服务器。但有时,从我的客户端Android应用程序向我的服务器发送此数据有一个最多5秒的延迟。我的问题是,有可能因为当用户触摸屏幕时正在执行大量的AsyncTasks ,可能是延迟是由于这个?如果情况并非如此,我还会附上服务器端代码。这是我的客户端代码:
编辑:更新了代码
@Override
public boolean onTouchEvent(MotionEvent event) {
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) > 50) {
lastUpdate = curTime;
int x = (int) event.getX();
int y = (int) event.getY();
String msg = x + " " + y + " " + "<EOF>";
new Client().execute(msg);
}
return false;
}
private class Client extends AsyncTask<String, Void, String> {
protected String doInBackground(String... messages) {
Socket socket;
try {
socket = new Socket(ip, 1755);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(messages[0]);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
现在,我每50毫秒发送一次触摸位置。但它对服务器端的影响是滞后的。如果我将间隔设置为小于50,比如20,则同样的问题仍然存在。也就是说,延迟最多可达5秒。有解决方案吗另外,我想必须根据每个设备设置间隔?
答案 0 :(得分:1)
你做错了。首先,如果您在HONEYCOMB之前运行,拥有“敏感”用户,您将最终获得大量AsyncTasks 并行运行,同时尝试达到您的终点,保持打开的套接字,消耗资源。也无法保证您将按照启动任务的相同顺序接收数据(更不用说错误处理)。另一方面,如果你在HONEYCOMB上运行,那么你最终会排队等待执行的大量AsyncTasks。这两种方式都没有办法,你应该缓存数据(将你的触摸存储在设备上的本地数据库中),然后不时地运行网络代码(即一旦DB中的数字或记录达到阈值或X分钟通过并在一个更大的请求中发送来自DB的所有数据。
修改强>
在我的服务器应用程序中,我想在用户在客户端应用程序中移动手指时移动我的对象
您需要重新考虑该方法,并尽可能使用“事件”,否则您的服务器应用程序会相当迟缓。因此,我宁愿尝试避免在拖动过程中通过发送每个X,Y来“拖动”,而是我只是创建“moveTo”事件并发送moveTo object Z to X,Y
,以便我的服务器应用程序能够更新状态对象。
编辑2
您无法以这种方式在服务器应用上拖动对象,但这只是一个缺点。是的,这是我的观点。不幸的是,服务器应用程序的主要目标是动画
然后你很可能还需要缓冲你的数据。还单网络任务按顺序发送事件。您可能想要进行一些“过滤”以限制每个时间单位的坐标数量(以避免快速移动和1秒内100个坐标对)。