为什么连接到createRfcommSocket创建的套接字比createInsecureRfcommSocketToServiceRecord更快?

时间:2014-08-16 17:09:14

标签: android sockets reflection bluetooth

为什么连接到createRfcommSocket使用反射创建的蓝牙套接字比createInsecureRfcommSocketToServiceRecord创建的更快?

BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
socket.connect();

VS

Class<?> cls = temp.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[]{ Integer.TYPE };
Method m = cls.getMethod("createRfcommSocket", paramTypes);
Object[] params = new Object[]{ Integer.valueOf(1) };
fallbackSocket = (BluetoothSocket) m.invoke(temp.getRemoteDevice(), params);

在远距离连接设备时,差异尤其明显。传统方法无法连接多次,更不用说连接调用需要明显更长的处理时间。另一方面,通过反射方法创建的套接字的连接从第一次开始,并且对connect()的调用很快。

是否有一个相对简单的解释呢?

1 个答案:

答案 0 :(得分:3)

相对简单的解释是前一种方法正在连接SDP服务记录。 SDP将UUID映射到一个通道,因此前者必须查找要使用SDP连接的通道。

对于后者,您告诉它您想要直接连接到通道1,因此不需要进行SDP发现来确定UUID映射到哪个通道。没有SDP查找意味着更少的时间来进行连接。