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

时间:2016-04-16 18:07:16

标签: android sockets android-asynctask

我正在进行套接字编程。每当用户触摸屏幕时,触摸位置就会发送到我的服务器。但有时,从我的客户端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秒。有解决方案吗另外,我想必须根据每个设备设置间隔?

1 个答案:

答案 0 :(得分:1)

你做错了。首先,如果您在HONEYCOMB之前运行,拥有“敏感”用户,您将最终获得大量AsyncTasks 并行运行,同时尝试达到您的终点,保持打开的套接字,消耗资源。也无法保证您将按照启动任务的相同顺序接收数据(更不用说错误处理)。另一方面,如果你在HONEYCOMB上运行,那么你最终会排队等待执行的大量AsyncTasks。这两种方式都没有办法,你应该缓存数据(将你的触摸存储在设备上的本地数据库中),然后不时地运行网络代码(即一旦DB中的数字或记录达到阈值或X分钟通过并在一个更大的请求中发送来自DB的所有数据。

修改

  

在我的服务器应用程序中,我想在用户在客户端应用程序中移动手指时移动我的对象

您需要重新考虑该方法,并尽可能使用“事件”,否则您的服务器应用程序会相当迟缓。因此,我宁愿尝试避免在拖动过程中通过发送每个X,Y来“拖动”,而是我只是创建“moveTo”事件并发送moveTo object Z to X,Y,以便我的服务器应用程序能够更新状态对象。

编辑2

  

您无法以这种方式在服务器应用上拖动对象,但这只是一个缺点。是的,这是我的观点。不幸的是,服务器应用程序的主要目标是动画

然后你很可能还需要缓冲你的数据。还网络任务按顺序发送事件。您可能想要进行一些“过滤”以限制每个时间单位的坐标数量(以避免快速移动和1秒内100个坐标对)。