close()和disconnect()之间的区别?

时间:2014-04-16 13:03:12

标签: android bluetooth bluetooth-lowenergy

Android蓝牙低功耗API实现了一种连接设备connectGatt()的方法,但有两种方法可以关闭连接disconnect()close()

文档说:

  • disconnect():断开已建立的连接,或取消连接尝试    目前正在进行中。

  • close():应用程序应在完成后尽早调用此方法      这个GATT客户。

BluetoothGatt.java的源代码显示close()取消注册应用程序,disconnect()断开客户端连接。然而,它没有说明实际意味着什么。我的意思是,如果只有一种方法可以连接到客户端,为什么有两种方法可以关闭/断开连接?

2 个答案:

答案 0 :(得分:57)

使用disconnect(),您可以稍后致电connect()并继续该周期。

致电close()后,您就完成了。如果您想再次连接,则需要再次致电connectGatt()上的BluetoothDevice; close()将释放BluetoothGatt所持有的所有资源。

答案 1 :(得分:12)

这是一些值得深思的问题:

只要你没有在Gatt上打电话,你仍然可以尝试连接它或发现。因此,当我尝试为机器发现服务时,我通常会运行一个线程或runnable,使请求连接到机器一段时间。

首次尝试使用机器连接,将返回一个BluetoothGatt对象,您可以在以后使用该对象尝试发现BluetoothDevice对象的服务。它似乎很容易连接,但更难发现机器服务。

mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);

所以在我的线程/ runnable中,我将检查BluetoothGatt是否为空。如果是,我将再次调用上面的代码行,否则我将尝试发现BluetoothGatt服务。

mBluetoothGatt.discoverServices();

哦,我总是确保在尝试连接发现服务之前调用BluetoothAdapter.cancelDiscovery()。

mBluetoothAdapter.cancelDiscovery();

这是一个方法用于连接我的runnable等:

public void connectToMachineService(BLEMachine machine) {
    Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName());

    mBluetoothAdapter.cancelDiscovery();

    if(mBluetoothGatt == null)
        mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
    else
        mBluetoothGatt.discoverServices();
}

最后,请确保关闭所有已连接的BluetoothGatt对象。在开始说“无法连接到Gatt服务器”或其他类似的东西之前,Android似乎可以处理五个BluetoothGatt对象。

在我创建的每个BluetoothGatt上,我将关闭它,然后广播更新,说明连接已关闭。似乎有很多次BluetootGatt在断开连接时不会响应状态变化。我关闭BluetoothGatt的方法是这样的。我让方法打开,让Activity调用服务,如果机器没有响应并且没有调用断开状态,则断开连接。

public void disconnectGatt(BluetoothGatt gatt) {
    if(gatt != null) {
        gatt.close();
        gatt = null;
    }

    broadcastUpdate(ACTION_STATE_CLOSED);
}