我正在尝试为Blackberry实现蓝牙功能类。但我被困在连接设备..
我做了一个简单的 MainScreen 连接,断开连接(现在)。蓝牙功能在另一个暗示BluetoothSerialPortListener 的类中得到了体现。
当我选择“connect”选项时,它会运行以下代码:
connect(BluetoothSerialPortInfo info){
port = new BluetoothSerialPort(info, BluetoothSerialPort.BAUD_57600,....,this);
当连接协议完成时,函数deviceConnected(boolean success)
由Blackberry执行,其中boolean
具有连接结果(如果已连接则为true,否则为false)。我想在从connect(BluetoothSerialPortInfo info)
方法返回之前检查此布尔值,因此我在wait(1000)
中添加notify()
,在deviceConnected(boolean success)
中添加wait(1000)
。
问题是两个函数或方法都由同一个线程执行,当connect(info)
完成时,超时完成,然后 deviceConnected 功能执行...
我尝试在一个单独的线程中运行 connect 方法,但它工作正常,但是我无法访问 MainScreen 对象以通知成功与否连接(即使我可以,我宁愿不这样做)。
我很想知道如何在单独的Thread中运行Listener方法,因此即使主线程忙,也可以执行它们。
提前致谢。
(我希望自己解释一下......)
修改 更多解释,如果我没有解释清楚:
问题是,我做connect(info)
,如果我尝试做Thread.sleep(10000),线程将睡10秒,然后调用deviceConnected方法,然后我能看到答案吗?我试图在运行deviceConnected
的方法中做的Watever只是推迟了deviceConnected
的执行。这就是为什么我会在另一个Thread中运行Listener方法(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;
}
监听器执行的方法:
synchronized(lock){
try{
lock.wait(10000);
}
catch(Exception e){}
if (_bDeviceIsConnected) return (0);
}
return(0x3F);
我尝试添加 connect 方法,例如:
lock.notify()
当然,在deviceConnected中添加{{1}}。但只要我等待,就会从BT_ConnectDevice 返回后执行 。
答案 0 :(得分:3)
我可以建议重新设想你的系统设计吗?为什么需要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
}
答案 1 :(得分:0)
你能不能在while循环中运行连接?
while(!success){
// try to connect
}
希望它会在你超时之前继续尝试。
关于多线程here's a link,它将向您展示如何完成服务器端的教程。 记住在类上可运行的工具,并运行()每个线程来启动它。
希望这会有所帮助。