我正在尝试为黑莓手机实现蓝牙功能类。但是我在连接设备时遇到了问题。
我制作了一个简单的 MainScreen 连接、断开连接(目前)。蓝牙功能在另一个类中实现,该类实现了 BluetoothSerialPortListener。
当我选择“连接”选项时,它运行这段代码:
connect(BluetoothSerialPortInfo info){
port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600,....,this);
当连接协议(protocol)完成时,函数 deviceConnected(boolean success)
由 Blackberry 执行,boolean
具有连接结果(如果它是 true已连接,如果未连接则为 false)。我想在从 connect(BluetoothSerialPortInfo info)
方法返回之前检查这个 boolean 值,所以我在里面放了一个 wait(1000)
和一个
。 deviceConnected(boolean success)
中的 notify()
问题是两个函数或方法都由同一个线程执行,当wait(1000)
发生时,超时结束,然后< em>deviceConnected 函数被执行...
我尝试在单独的线程中运行 connect 方法,它成功了,但是我无法访问 MainScreen 对象来通知成功与否连接(即使可以,我也宁愿不这样做)。
我很想知道如何在单独的线程中运行 Listener 方法,这样即使主线程很忙也可以执行它们。
提前致谢。
(我希望我解释了自己...)
编辑 更多解释,以防我解释得不好:
事情是,我做 connect(info)
,如果我尝试做,例如 Thread.sleep(10000),线程将 hibernate 10 秒,在那之后,deviceConnected方法被调用,然后我可以看到答案。无论我尝试在运行 connect(info)
的方法中做什么,都只是推迟 deviceConnected
的执行。这就是为什么我会在另一个线程中运行 Listener 方法(例如 deviceConnected
),因此它可以在我在方法 connect(info)
中等待答案时执行....
编辑:代码:
连接方法:
public int BT_ConnectDevice(BluetoothSerialPortInfo info)
{
if (info==null) return(0x4F);
try
{
_port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600, BluetoothSerialPort.DATA_FORMAT_PARITY_NONE | BluetoothSerialPort.DATA_FORMAT_STOP_BITS_1 | BluetoothSerialPort.DATA_FORMAT_DATA_BITS_8, BluetoothSerialPort.FLOW_CONTROL_NONE, 1024, 1024, this);
return(0);
}
catch(Exception e)
{
return(0x3F);
}
}
监听器执行的方法:
public void deviceConnected(boolean success)
{
this._bDeviceIsConnected=success;
}
我尝试在 connect 方法中添加如下内容:
synchronized(lock){
try{
lock.wait(10000);
}
catch(Exception e){}
if (_bDeviceIsConnected) return (0);
}
return(0x3F);
当然,在 deviceConnected 中添加 lock.notify()
。但只要我等待,deviceConnected 就会在 从 BT_ConnectDevice 返回 后执行。
最佳答案
我可以建议重新构想您的系统设计吗?为什么需要阻塞 connect() 方法?
我的建议是重新设计,以便调用 connect() 的代码理解这是一个非阻塞调用,然后让您的监听器在连接建立后启动必要的后续步骤。
你可以尝试像这样的伪代码:
public void fieldChanged(Field f, int c) {
if (f == myConnectButton) {
connect(...);
}
}
private class MyBluetoothConnectionListener ... {
public void deviceConnected(boolean success) {
if (success) {
bluetoothConnectionEstablished();
} else {
bluetoothConnectionFailed();
}
}
}
private void bluetoothConnectionEstablished() {
// TODO - put your logic here for what to do when the connection succeeds
}
private void bluetoothConnectionFailed() {
// TODO - put your logic here for what to do when the connection fails
}
关于java - 等待事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022738/