【问题标题】:Timer for inactivity during a loop循环期间不活动的计时器
【发布时间】:2013-05-22 12:05:33
【问题描述】:

我正在编写一个连接到蓝牙设备的应用程序,然后发送消息并获得答案。这是我用来得到答案的代码:

    StringBuilder res = new StringBuilder();
    while ((char) (b = (byte) in.read()) != '>') {
        if ((char) b != ' ') {
            res.append((char) b);
        }
    }
    rawData = res.toString().trim();

基本上,它将每个字符一个接一个地添加到 StringBuilder 中

当有答案时,没问题,它就起作用了。但问题是当设备没有应答时(因为无论如何连接都丢失了)。

如何限制等待角色的时间?

编辑:

这是我的蓝牙连接

final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
    _dev = btAdapter.getRemoteDevice(remoteDevice);
    try {

        Method m;
        m = _dev.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
        _sock = (BluetoothSocket) m.invoke(_dev, 1);
        _sock.connect();
        setState(STATE_CONNECTED);
        sockIn = _sock.getInputStream();
        sockOut = _sock.getOutputStream();

    } catch (Exception e) {
        closeConnection();
    }

【问题讨论】:

  • 你是如何连接蓝牙的?我认为您可以设置连接超时。

标签: java android


【解决方案1】:

使用InputStream“可用”方法

reference page for InputStream

在读取之前检查流中是否有数据而不阻塞,并检查读取之间经过的时间以确定是否发生超时(System.getCurrentTimeMillis() 应该完成这项工作)。

查看此答案以获取参考和完整列表:

Implement a timeout in BluetoothSocket inputstream.read() in Android

编辑:

如果我在你的 cmets 的行之间正确读取,你真的可以使用蓝牙 UDP 套接字......

遗憾的是似乎你不能在 Android 上通过蓝牙使用数据报,因此你必须坚持使用 TCP。

如果您要在设备之间发送的数据是事件驱动的(例如,您希望设备 A 上的用户在设备 B 上的用户触摸屏幕/发射武器等时立即收到通知),您仍然可以调整你的阅读循环做你想做的事。

您所需要的只是一个工作线程,用于放置循环执行 I/O 繁重的工作,以及一个 Handler(在 UI 线程中创建),一旦您收到任何内容,它将通知您选择的某个 Listener。

请记住,我只是在猜测您的使用场景,所以如果异步事件驱动通信不是问题,请不要误导。

希望对你有帮助

【讨论】:

  • 如果我理解得很好,在这个例子中,你检查 InputStream 中是否有一些字节,然后你开始阅读它。这给我带来了一个问题,只要我需要非常快地得到答案消息,我还是会尝试这个,看看它是否在没有计时器循环的情况下工作
  • 我已经扩展了我的答案,但我仍然不确定问题是什么。 “我需要非常快地得到回复信息”是什么意思?据我了解,您收到答案的速度主要取决于您的同行发送它的速度......
  • 我正在编写的应用程序有点特殊。当我用我的 android 设备编写一些命令时,另一个蓝牙设备(根本不是 Android)会发送一个答案。我需要非常快地得到这个答案,这就是为什么我会尽量减少循环中的Thread.sleep(someTime);。在反射之后,如果睡眠时间真的很短(可能是 5 毫秒),这不应该让应用程序太慢。感谢您的完整回答
  • 好吧,如果电池消耗不是一个大问题,您可以完全删除 Thread.sleep,因为所有事情都发生在一个单独的线程中,它不应该损害响应能力。根据您的使用场景,您还可以尝试将睡眠与通信通道上的预期活动相匹配(例如:如果您希望命令以突发形式出现,则可以等待每次循环迭代 100 毫秒,直到某些消息到达,然后等待至少接下来的 10 次迭代,只要命令不断出现,你就等待 1ms。只是一个例子)。欢迎您
猜你喜欢
  • 2017-05-12
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多