我正在尝试为Blackberry实现蓝牙功能类。但是我在连接设备时陷入了困境。
我制作了一个简单的MainScreen,用于连接和断开连接(目前)。蓝牙功能已嵌入到另一个实现BluetoothSerialPortListener的类中。
当我选择“连接”选项时,它将运行以下代码:
connect(BluetoothSerialPortInfo info){
port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600,....,this);
连接协议(protocol)完成后,Blackberry将执行
deviceConnected(boolean success)
函数,其boolean
具有连接的结果(如果已连接,则为true,否则为false)。我想在从connect(BluetoothSerialPortInfo info)
方法返回之前检查此 boolean 值,因此我在其中放入了wait(1000)
,在notify()
中放入了deviceConnected(boolean success)
。问题是两个函数或方法都由同一线程执行,并且在制作
wait(1000)
时,超时结束,然后执行deviceConnected函数。我试图在单独的线程中运行connect方法,并且该方法起作用了,但是后来我无法访问MainScreen对象来通知连接是否成功(即使我可以,我宁愿不这样做) 。
我很想知道如何在单独的线程中运行Listener方法,因此即使主线程很忙也可以执行它们。
提前致谢。
(我希望我自己说明一下...)
编辑
更多说明,以防万一我没有很好地说明它:
事情是,我做
connect(info)
,如果我尝试做例如Thread.sleep(10000),该线程将进入休眠状态10秒钟,之后,将调用deviceConnected方法,然后可以看到答案。我尝试在运行connect(info)
的方法中做的只是推迟deviceConnected
的执行。这就是为什么我要在另一个线程中运行监听器方法(例如deviceConnected
)的原因,因此当我在方法connect(info)
中等待答案时可以执行该方法。编辑:CODE:
连接方法:
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()
。但是只要我等待,从BT_ConnectDevice返回后,就会在之后执行deviceConnected。 最佳答案
我可能建议您重新构想您的系统设计吗?为什么需要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
}