我在做socket编程 . 每当用户触摸屏幕时,触摸位置就会发送到我的服务器 . 但有时,从我的客户端Android应用程序向我的服务器发送此数据有一个最多5秒的延迟 . 我的问题是,有可能因为当用户触摸屏幕时正在执行大量的AsyncTasks ,可能是延迟是由于这个?如果不是这样的话,我还会附上服务器端代码 . 这是我的客户端代码:
EDIT: 更新了代码
@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秒 . 有解决方案吗另外,我想必须根据每个设备设置间隔?
1 回答
你做错了 . 首先,如果您在HONEYCOMB之前运行,拥有"touchy"用户,您将最终获得大量的AsyncTasks running in parallel 同时尝试达到您的终点,保持打开的套接字,消耗资源 . 也无法保证您将按照启动任务的相同顺序接收数据(更不用说错误处理) . 另一方面,如果你在HONEYCOMB上运行,那么你最终会排队等待执行的大量AsyncTasks . 这两种方式都没有办法,你应该缓存数据(将你的触摸存储在设备上的本地数据库中),然后不时地运行网络代码(即一旦DB中的数字或记录达到阈值或X分钟通过并在一个更大的请求中发送来自DB的所有数据 .
EDIT
您需要重新考虑该方法,并尽可能使用"events",否则您的服务器应用程序会相当迟缓 . 所以我宁愿在拖动过程中通过发送每个X,Y来避免做"dragging",而是我只是创建"moveTo"事件并发送
moveTo object Z to X,Y
所以我的服务器应用程序将能够更新对象的状态 .EDIT 2
那么你很可能还需要缓冲你的数据 . 也是 single 网络任务按顺序发送事件 . 无论如何,您可能想要做一些"filtering"来限制每个时间单位的坐标数量(以避免快速移动和1秒内100个坐标对) .