循环期间不活动的计时器

时间:2013-05-27 15:37:47

标签: java android

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

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

基本上,它逐个接受每个字符并将它们添加到StringBuilder

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

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

编辑:

这是我的BlueTooth连接

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();
    }

1 个答案:

答案 0 :(得分:1)

使用InputStream“可用”方法

reference page for InputStream

在没有阻塞的情况下检查流中是否有数据,并检查读取之间的经过时间以确定是否发生超时(System.getCurrentTimeMillis()应该执行该作业)。

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

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

修改

如果我正在您的评论之间正确阅读,您可以使用蓝牙UDP套接字......

可悲的是似乎你不能在Android上使用带蓝牙的数据报,因此你必须坚持使用TCP。

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

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

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

希望这有帮助