我一直在理解"Bluetooth Chat" example的源代码。 BluetoothChatService包含一个Thread(称为 ConnectThread ),它在创建套接字(本地名称为 mmSocket )之后,如果一切顺利,则调用< em>已连接方法:
connected(mmSocket, mDevice);
因此, mmSocket 作为参数传递。连接方法具有以下签名:
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device);
并包含以下一行:
mConnectThread.cancel(); //mConnetcThread is an instance of ConnectThread
cancel 方法包含以下代码:
mmSocket.close();
因此关闭 mmSocket ,并且作为连接方法shuold的第一个参数传递的套接字被关闭(因为它引用同一个对象),并且当下一个代码调用时:
mConnectedThread = newConnectedThread(socket); // socket should be already closed
我认为这是错误的,因为套接字现在已关闭,我无法对其进行任何操作(例如读取或写入与套接字关联的InputStream
或OutputStream
上的数据)。我错了吗?
答案 0 :(得分:1)
您可以在mConnectThread
方法中取消connected
之前检查到它是否为空。同时,这是从第434行开始的connected
的完整调用:
// Reset the ConnectThread because we're done
synchronized (BluetoothChatService.this) {
mConnectThread = null;
}
// Start the connected thread
connected(mmSocket, mmDevice);
可以看出,mConnectThread
在调用connected