java - 等待事件

标签 java multithreading events blackberry

我正在尝试为黑莓手机实现蓝牙功能类。但是我在连接设备时遇到了问题。

我制作了一个简单的 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/

相关文章:

java - 与简单条件混淆

c++ - 为什么我们在 pthread_create 中将函数参数作为 void* 传递?

JavaScript On Change 函数仅触发一次

java - 在 Java9 中,如果我不知道它是模块,我如何反射性地加载一个类?

java - ListView 中的复选框

java - 如果 Java 的 parseInt 对于有效的 IEEE-754 二进制文件失败,那么哪个 API 不会失败?

java - 是否可以使用常规 JVM 创建一个不会被任何其他线程抢占的高优先级线程?

multithreading - 共享内存计算机上的多线程 FFTW 3.1.2

actionscript-3 - 为什么 Actionscript 3 ENTER_FRAME 事件如此疯狂?

在 for 循环中创建的 Javascript 多个动态 addEventListener - 传递参数不起作用