【问题标题】:Android Socket Programming: AsyncTask for sending real-time dataAndroid Socket 编程:用于发送实时数据的 AsyncTask
【发布时间】:2016-04-16 18:07:15
【问题描述】:

我正在做套接字编程。每当用户触摸屏幕时,触摸位置都会发送到我的服务器。但有时,将这些数据从我的客户端 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 秒的延迟。有什么解决办法吗?另外,我猜这个间隔必须根据每个设备设置?

【问题讨论】:

  • 你为什么总是关闭套接字?
  • 我刚找了一个例子,照着做了。我是套接字编程的初学者。

标签: android sockets android-asynctask


【解决方案1】:

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

编辑

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

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

编辑 2

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

那么您很可能需要缓冲您的数据。还有单个网络任务按顺序发送事件。无论如何,您可能都想做一些“过滤”以限制每个时间单位的坐标数(即避免快速移动和 1 秒内 100 个坐标对)。

【讨论】:

  • 就我而言,我想对这些触摸做出实时反应。
  • 在我的服务器应用程序中,我想在用户在客户端应用程序中移动手指时移动我的对象,那么还有其他替代方法可以更快地发送数据吗?
  • 你能给我一个想法吗?我不是要代码,只是一个方向。
  • 问题还没有解决吗?当用户仍在拖动对象时,服务器应用程序会发生什么?如果拖动过程需要 5 秒怎么办?对象不会在 5 秒后开始拖动吗?
  • 您的意思是“事件”方法”?5、10 或 100 秒后什么都没有发生,因为您只会在用户完成拖动事件时创建“拖动”事件。您不会能够以这种方式在您的服务器应用程序上拖动对象设置动画,但这只是缺点。事实上,事件的“拖动”名称可能会产生误导。它应该是“移动”。我编辑了答案以反映这一点
猜你喜欢
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多