首页 文章

Android Socket Programming:用于发送实时数据的AsyncTask

提问于
浏览
0

我在做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 回答

  • 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个坐标对) .

相关问题