我正在尝试为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
}

09-13 06:03