gpt4 book ai didi

java - 循环期间不活动的计时器

转载 作者:行者123 更新时间:2023-11-30 03:34:48 25 4
gpt4 key购买 nike

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

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

最佳答案

使用 InputStream 的“可用”方法

reference page for InputStream

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

检查此答案以供引用和完整列表:

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

编辑:

如果我没看错你的评论,你真的可以使用蓝牙 UDP 套接字......

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

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

您所需要的只是一个工作线程,用于放置执行 I/O 繁重工作的循环,以及一个处理程序(在 UI 线程中创建它),它会在您收到任何内容后立即通知您选择的某些监听器。

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

希望对你有帮助

关于java - 循环期间不活动的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16776456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com