callback机制回调机制

一、系统自动实现的回调机制

callback 机制在Android 中无处不在,特别是以Handler、Callback、Listener这三个词结尾的,都是利用callback机制来实现的。比如:

1)接口onClickListener就是封装在View中的callback。

        View.OnClickListenerclickListener= newOnClickListener() {   

           @Override

           public void onClick(View v) {…..

           }       };

        button1.setOnClickListener(clickListener);

 

Nested Classes of View

interface

View.OnClickListener

Interface definition for a callback to be invoked when a view is clicked.

当Click事件发生时,系统自动回调clickListener接口已经实现的onClick方法。

2)接口Handler.Callback就是封装在Handler中的callback.

Handler handler = new Handler(){

           @Override

           public voidhandleMessage(Message msg) {….}};

 

Nested Classes of Handler

interface

Handler.Callback

Callback interface you can use when instantiating a Handler to avoid having to implement your own subclass of Handler.

 

publicstatic interface  Handler.Callback有如下方法:

publicabstract boolean handleMessage (Message msg)

 

当调用handler.sendMessage(m);或类似的方法时,系统在适当的时候自动回调已经实现的方法handleMessage

 

3) 抽象类或接口回调BluetoothGattCallback

public abstract class  BluetoothGattCallback有如下方法:

首先定义匿名内部类,实现抽象类BluetoothGattCallback的一些方法:

然后确定使用该回调对象的时机:

mBluetoothGatt= device.connectGatt(mContext, false, mGattCallback);

当Android端调用connectGatt连接到BLE设备device上的GATT服务端过程中,会依次发生一些事件,可选择需要处理的事件重载。当发生这些事件时,系统自动调用被重载的方法。

二、自定义的回调机制

1、在B类中定义

publicclassBluetoothLeClass {

….     

/*定义内部接口*/

    public interfaceOnServiceDiscoverListener {

        public voidonServiceDiscover(BluetoothGatt gatt);

    }

  

/*定义对该接口的内部引用*/

    private OnServiceDiscoverListenermOnServiceDiscoverListener;

 

/*接口引用的setter*/

    public voidsetOnServiceDiscoverListener(OnServiceDiscoverListener l) {

        mOnServiceDiscoverListener= l;

    }

2、在A类中实现接口,并将该实现传给B类。

    privateBluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = newOnServiceDiscoverListener() {

        @Override

        public voidonServiceDiscover(BluetoothGatt gatt) {

           }  

};

MainActivity的onCreate中,将B类也就是mBLE的接口引用赋值为MainActivity已经实现的接口。

        // 发现BLE终端的Service时回调

        mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);

3、在B类中调用接口中的方法,实际上是回调A中已经实现的接口中的方法

private finalBluetoothGattCallback mGattCallback = newBluetoothGattCallback() {@Override

        public voidonServicesDiscovered(BluetoothGatt gatt, intstatus){

        if (status == BluetoothGatt.GATT_SUCCESS&& mOnServiceDiscoverListener != null){mOnServiceDiscoverListener.onServiceDiscover(gatt);

…}}

与系统定义的自动回调机制不同,此处是我们在代码里显式调用接口中的方法。

 

三、实验一中既有系统自动实现的回调机制,也有自定义的回调机制。

大概的流程如下:

1、MainActivity中点击连接某个蓝牙设备调用mBLE.connect(device.getAddress())

2、->BluetoothLeClass中的connect(finalString address):

  检查之后建立新的连接mBluetoothGatt= device.connectGatt(mContext, false, mGattCallback);如果连接成功,就会自动触发mGattCallback中定义的各种回调。(系统自动实现的回调机制)

3、注意BluetoothGattCallbackmGattCallback中红色字体

private finalBluetoothGattCallback mGattCallback = newBluetoothGattCallback() {

        @Override

        public voidonConnectionStateChange(BluetoothGatt gatt, intstatus,intnewState){

           if (newState == BluetoothProfile.STATE_CONNECTED){

               if (mOnConnectListener!= null)

                   mOnConnectListener.onConnect(gatt);

               Log.i(TAG, "Connected to GATT server.");

               // Attempts to discover services after successfulconnection.

               Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices());

 

           }elseif(newState== BluetoothProfile.STATE_DISCONNECTED) {

               if (mOnDisconnectListener!= null)

                   mOnDisconnectListener.onDisconnect(gatt);

               Log.i(TAG, "Disconnected from GATT server.");

           }

        }

        @Override

        public void onServicesDiscovered(BluetoothGattgatt,intstatus){

        if (status == BluetoothGatt.GATT_SUCCESS&& mOnServiceDiscoverListener != null){        (自定义的回调机制)

               mOnServiceDiscoverListener.onServiceDiscover(gatt);

           }else{

               Log.i(TAG, "onServicesDiscovered received: " + status);

           }

        }

        @Override

        public voidonCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, intstatus){

           if (mOnDataAvailableListener!= null)

               mOnDataAvailableListener.onCharacteristicRead(gatt, characteristic,status);

        }

        @Override

        public voidonCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

           if (mOnDataAvailableListener!= null)

               mOnDataAvailableListener.onCharacteristicWrite(gatt, characteristic);

        }

    };

4、MainActivity中已经有匿名类实现了其中两个接口。

    privateBluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = newOnServiceDiscoverListener() {

        @Override

        public voidonServiceDiscover(BluetoothGatt gatt) {

           }  

};

    privateBluetoothLeClass.OnDataAvailableListener mOnDataAvailable = newOnDataAvailableListener() {

        @Override

        public void onCharacteristicRead(BluetoothGattgatt,BluetoothGattCharacteristic characteristic, intstatus){    }

 

        @Override

        public voidonCharacteristicWrite(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic) {…}

};

5、MainActivity的onCreate中,将mBLE的接口引用赋值为MainActivity已经实现的接口。

        // 发现BLE终端的Service时回调

        mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);

        // 收到BLE终端数据交互的事件

        mBLE.setOnDataAvailableListener(mOnDataAvailable);

所以在BluetoothGattCallback mGattCallback中,

mOnServiceDiscoverListener.onServiceDiscover(gatt);

mOnDataAvailableListener.onCharacteristicRead(gatt, characteristic,status);

mOnDataAvailableListener.onCharacteristicWrite(gatt, characteristic);

此时这些引用实际指向MainActivity中已经实现的接口,调用的方法也是其中已经实现的方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值