Java 经过长时间等待后,蓝牙插座状态出现混乱
我目前正在尝试修复我的Android应用程序遇到的一个问题,该应用程序需要蓝牙连接。有一段时间,一切似乎都正常,但我注意到,当我想要连接的从属蓝牙设备未通电时,出现了一些奇怪的情况。这是我的密码:Java 经过长时间等待后,蓝牙插座状态出现混乱,java,android,sockets,bluetooth,Java,Android,Sockets,Bluetooth,我目前正在尝试修复我的Android应用程序遇到的一个问题,该应用程序需要蓝牙连接。有一段时间,一切似乎都正常,但我注意到,当我想要连接的从属蓝牙设备未通电时,出现了一些奇怪的情况。这是我的密码: private void connectDevice() { mBluetoothAdapter.cancelDiscovery(); BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); tr
private void connectDevice() {
mBluetoothAdapter.cancelDiscovery();
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
errorExit("Fatal Error", "Socket create failed: " + e.getMessage() + ".");
}
//Try to establish the connection. This will block until it connects.
Log.d(TAG, "...Connecting...");
try {
btSocket.connect();
Log.d(TAG, "....Connection ok...");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
errorExit("Fatal Error", "Unable to close socket during connection failure" + e2.getMessage() + ".");
}
}
//Create a data stream so we can talk to server.
Log.d(TAG, "...Create Socket...");
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
mActionBar.setSubtitle("Connected");
return;
}
这里是我称之为这种方法的地方:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case REQUEST_ENABLE_BT:
if (resultCode == RESULT_OK) {
Toast.makeText(this, R.string.bt_enabled, Toast.LENGTH_SHORT).show();
setupCom();
break;
}
else {
// User did not enable Bluetooth or an error occurred
if(D) Log.d(TAG, "BT not enabled");
Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();
finish();
break;
}
case REQUEST_CONNECT_DEVICE:
if (resultCode == RESULT_OK){
retrieveAddresse(data);
connectDevice();
}
break;
}
return;
}
我的问题是,当我不在范围内或者我想连接的设备没有通电时,connectDevice()方法似乎会执行所有代码,即使无法连接,因为Android操作系统不想被连接过程阻塞。我注意到这个问题是因为mActionBar.setSubtitle(“Connected”);执行,因为当我在范围内或从蓝牙模块打开时尝试重新连接。除非重新启动应用程序,否则无法连接到它 把这些行放在下面:
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
mActionBar.setSubtitle("Connecté");
在第一次尝试中。这样,只有当设备建立连接时,才会执行这些操作。因为实际上它们在try/catch之外,所以即使没有连接,它们也将始终执行。如何获取设备地址?使用bluetooth discovery?地址由DeviceListActivity类检索,该类为我提供列表中的所有设备。我选择一个设备并提取此部分工作的地址。对,关于线程,您是正确的。但是,如果我无法连接,为什么我会获得连接状态?您的代码可以在btSocket.connect()上被阻止,但与您的设备可以连接或不能连接无关,在该行之后,您的代码将不再被阻止。也许您的connectedThread可以阻塞,但它运行在主线程之外。当您尝试连接超出范围的设备时,是否会出现错误?是的,正如我的问题解释中所述,一切正常,但当设备超出范围时,我有问题。如果发生这种情况,我必须重新启动应用程序,否则我将无法连接。应用程序的连接状态似乎很模糊,即使蓝牙设备现在在范围内,我也无法断开或连接。