BluetoothGattCallback重复回调 10C

这是概率很低的问题,每次复现这个问题的情况都不太一样,我也还没搞清楚为什么会出现这种问题。

上一次出现这个问题的情况是:
在这次连接之前也有重复连接/断开其他蓝牙设备,最后一次连接蓝牙设备时,蓝牙端显示已连接上,但app端还没收到回调,过了一阵子,onConnectionStateChange才收到回调,接着又自动断开重连,于是,问题就出现了。

当出现这个问题时,BluetoothGattCallback里面的每一个方法断开、连接、发现服务、接收数据等都会重复接收,所以判断是BluetoothGattCallback重复了,但我看了后台服务,确实是只有一个服务;

排除是蓝牙端的问题,因为换蓝牙或者蓝牙关机等都只要APP不重启这个问题依旧在。

所以,应该是还有一个BluetoothGattCallback的对象存在。
那么,有哪些原因可能会导致这种情况呢?如果出现这种情况该怎么解决?比如有没有什么方法可以列出所有的BluetoothGattCallback,然后close其他的BluetoothGattCallback对象,只保留一个?

这是连接部分的代码,这些都是在后台service中执行的

 public boolean connect(final String address) {
        if (mBluetoothAdapter == null) {
            return false;
        }
        if (address == null) {
            return false;
        }
        connectAdress = address;
        if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
                && mBluetoothGatt!=null) {

            if (mBluetoothGatt.connect()) {
                mConnectionState = STATE_CONNECTING;
                return true;
            } else {
                return false;
            }
        }
        final BluetoothDevice deivce = mBluetoothAdapter.getRemoteDevice(address);
        if (deivce == null) {
            Log.e(TAG, "connect: Device not found. unable to connect." );
            return false;
        }
        mBluetoothGatt = deivce.connectGatt(this, true, mGattCallback);
        mBluetoothDeviceAddress = address;
        mConnectionState = STATE_CONNECTING;

        return true;
    }

//    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    public void disconnect() {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.e(TAG, "disconnect: BluetoothAdapter not initialized" );
            return;
        }
        is_click_disconnect = true;
        VERTICAL_DISCOVER_FLAG = 0;
        LEVEL_DISCOVER_FLAG = 0;
        current_connecting_mac_address = "";
        mBluetoothGatt.disconnect();
        stopSelf();

    }

然后这是回调部分的代码,

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        /**
         * 连接状态改变
         * @param gatt
         * @param status
         * @param newState
         */
//        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
//            super.onConnectionStateChange(gatt, status, newState);
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED;
                mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                BleMessage message = new BleMessage();
                message.setAction(ACTION_GATT_CONNECTED);
                message.setConnectState(STATE_CONNECTED);
//                连接成功

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = ACTION_GATT_DISCONNECTED;
                mConnectionState = STAAE_DISCONNECTED;
                VERTICAL_DISCOVER_FLAG = 0;
                LEVEL_DISCOVER_FLAG = 0;
                Log.e(TAG, "vitec 蓝牙断开连接onConnectionStateChange: Disconnect from gatt server" );
                broadcastUpdate(intentAction);
                textToSpeechHelper.speakChinese("蓝牙连接断开");
                //当手动断开连接,关闭mBluetoothGatt
                if (is_click_disconnect) {
                    mBluetoothGatt.close();
                    mBluetoothGatt = null;
                    is_click_disconnect = false;
                }
            }
        }

        /**
         * 发现服务
         * @param gatt
         * @param status
         */
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
                enableTXNotification(SYSTEM_RX_SERVICE_UUID, SYSTEM_TX_CHAR_UUID);

        }

        /**
         * 读取特征值
         * @param gatt
         * @param characteristic
         * @param status
         */
//        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
                Log.e(TAG, "onCharacteristicRead: 当前读取到的特征值为:"+  new String(characteristic.getValue()));
            }
        }

        /**
         * 写入特征值
         * @param gatt
         * @param characteristic
         * @param status
         */
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
        }

        /**
         * 
         * @param gatt
         * @param characteristic
         */
//        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

            broadcastUpdate(ACTION_DATA_AVAILABLE,characteristic);
        }
    };

1个回答

qq_35696987
芒大大 这是基本用法,不是解决问题的办法
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
微信重复回调的坑
最近做了一个微信支付的对接,前面的功能还好,因为是对接第三方公司   华阳微信的接口,所以大部分数据都是以json传送的 不过支付成功后的回调接口华阳没有处理,是直接对接微信官方的,只有自己去写转换咯,网上虽然有工具类,但是只有这个地方要转换,我就直接用jdk 进行转换了,有兴趣的可以看看我的另一篇文章 http://blog.csdn.net/zxc_user/ar
微信支付重复回调
这个问题困扰了几天,问了很多人,网上也查了很多,用了很多个网上说的可以的方法都没能成功,最后总算成功了,所以分享一下,希望能对人有所帮助。 直接上代码 <?php //所有输出必须为success,且输出必须使用echo方式且需要exit停止后续程序否则重复回调,return只返回值不能输出值 ini_set('date.timezone', 'Asia/Shanghai'); $xml...
关于微信重复回调的问题
最近在做一个微信支付的业务,在处理支付成功后续业务的时候,老是出现重复回调的问题,这个问题困扰了我很久。最后发现居然是@RestController的问题,在类注解上面的@RestController会将结果变成Json格式,但是这样和微信的xml结果返回值有冲突,只需要给微信回复一个String格式的xml即可。同时,将@RestController改为@Controller。代码如下: ...
java 微信支付重复回调问题
分析线上日志发现,微信支付总是多次回调,其实每次都是支付成功的 微信支付文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8 以前的代码大概是这样写的 用了@RestController注解,但是微信支付一直认为是有问题的 后来想到,返回为json数据干扰了,毕竟微信支付用的是xml。是不是可以用...
微信支付重复回调的相关问题(2018-12-18)
当微信统一下单完成后会调用我们回调的接口,此时在回调中处理业务逻辑时要注意: 如果是微信小程序的推送消息,可能会出现重复推送的问题,解决办法是: 在回调逻辑中通知微信成功后再进行消息的推送,且推送之前需要根据数据库中订单表的状态字段来判断是否已经支付完成,完成则可以推送 ...
微信扫码支付后不断重复回调,怎么办?
echo '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>'; 就这样,处理完业务后,告诉微信服务器,老子搞完了,闭嘴! ...
详解蓝牙BluetoothGattCallback用法之BLE数据发送
详解蓝牙BluetoothGattCallback用法之BLE数据发送看了好多网上的例子,感觉都是一大抄,都是些什么官方demo,用的都是跟别人一样的广播啊,服务啊,什么鬼,看起来高大上其实没什么卵用的东西,都没有理解到BluetoothGattCallback这个函数里面发送数据与接收数据的精髓,扯一堆东西,结果最后还是不能用,接下来我就直接开始撸干货了,什么蓝牙扫描,蓝牙连接,我就先不说了,直接
详解蓝牙BluetoothGattCallback用法之BLE数据接收
详解蓝牙BluetoothGattCallback用法之BLE数据接收这篇继续讲解数据接收,想要接收到数据必须先要使能通知@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) {//发现服务,在蓝牙连接的时候会调用 List<BluetoothGattService> list =
回调
就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为callback的方法f(CallBack callback
回调 3 回调 3
回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。 回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。
回调 2 回调 2
委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。 委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。
回调 回调 1
异步消息的传递-回调机制 异步消息的传递-回调机制
Callback(回调),线程回调
线程回调演示代码,使用的例子代码,立即java核心机制。
python[回调-内联回调]
摘要:理解什么是回调,回调函数就应该是一个模板框架,也像是一个抽像流程,也像面向对象中的模块模式设计,也像wiki说那样,允许低层代码调用高层代码;根据这样思想,应用python进行实现,实现的方法有多种,分别为: 简单回调,基于闭包的回调,基于类的回调, 基于生成器的回调,采用队列管理的回调,内联回调等5个方法去实现相关的回调。环境:Python 3.5.2 (v3.5.2:4def2a2901a
异步回调与同步回调
同步回调        我们常用的一些请求都是同步回调的,同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。异步回调        有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的异步回调。我们在调用一个方法时,如果执行时间比较长,我们可以传入一个回调的方法,当方法执行完时,让被调用者执行给定的回调方法。异步回调java实现democlient接口pu...
java回调,js回调
public interface CallBack { //public String doThis2(String name,String password); public void doThis(String...strings); }   public class HellBack { /* public String hech...
回调?
最近有个妹子问我回调是什么意思,我心里一琢磨,回调?撒玩意,我也不清楚啊,但是我又不能说我不知道啊,这样不表现我不行吗,在妹子面前我可不能说不行啊。我跟妹子说,你等我一下,我有时间答复你,妹子给我留了个电话号码,说等我答复哦! 在网上搜索了几篇文章,也看了点书,算是对回调有了一定的了解,首先是概念; class A实现接口InA ——背景1class A中包含一个class B的引
关于js的回调、同步回调、异步回调
回调定义 刚开始学习javascript时,对回调函数的理解仅仅停留在知道定义阶段。什么是回调函数? 就是将一个函数作为参数传递给另一个函数,作为参数的这个函数就是回调函数。 至于为什么要用到回调函数?回调函数有什么作用? 当时对这些一无所知! 最近学习node.js涉及到了大量的异步编程,很多地方都需要用到回调函数,所以这两天深入了解...
回调函数 同步回调 异步回调
目录 回调函数 同步回调和异步回调 同步回调 异步回调 回调函数 回调函数一般是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此时有两种方式: A将数据d存储好放在接口函数中,B自己想什么时候去读就什么时候去读,这就是我们经常使用的函数调用,此时主动权是B。 ...
ios-block回调 仅仅是回调.zip
Block 类回调
自定义了一个radiobox , 重复创建的delege不 回调
自定义了一个radiobox , 当选择的时候通过delege 回调给委托页面rn如果只定义一个没有问题, 但如果定义多个,后面的都不执行了 , 但第一个没有问题rn[code=csharp]rn var rb1 = RadioBox(frame: CGRectMake(0, 80, 120, 32));rn rb1.SetCheckBox(1, title: "测试一下");rn rb1.delegate = self;rn self.addSubview(rb1);rn rb1.Checked = true;rn var rb2 = RadioBox(frame: CGRectMake(0, 150, 120, 32));rn rb2.SetCheckBox(2, title: "测试二下");rn rb2.delegate = self;rn self.addSubview(rb2);rn func IsRadioBoxClicked(id: Int, state: Bool) rnrn[/code]
【业务解决方法】现在项目存在充值,支付宝重复回调的问题。
现在项目存在充值,支付宝重复回调的问题。rnrn重复回调的原因就是平台迟迟未给支付宝响应,以至于 支付宝多次 回调。rnrn而项目又采用的 主主复制,肯定是无法使用数据库加锁来来解决。rnrn方案一:通过redis 实现 逻辑加锁 处理,rn方案二:项目里通过队列,缓存请求,rn方案三:通过 MQ消息中间件 rnrn上叙,未细致描述,想问问行业老大哥面对此问题时,都是如何解决的?
回调传值 自定义Dialog中控件回调 自定义控件回调
曾经项目中用到的回调: 这是一个类中的方法:只需要传入一个AppMonitorListener接口的实现类对象即可; 另一个A类(调回调), 另一个B类(调回调), 重点看下图片中写的注释!! 规定客户端拿到服务端发出的数据后做的方法,具体实现还要靠客户端去实现; 服务端类(把值传出去的那个类,最终客户端调...
回调端口以xml方式回调,取回调内容解析
[AcceptVerbs("Post")] public HttpResponseMessage Notify([FromBody] CallbackInfo callbackInfos) { try { var BackContent = Request.Content;
java 回调机制分为:异步回调 同步回调
java 回调机制分为:异步回调   同步回调 模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,这句话可能有点绕,等文章后面举例说明;异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各
JNA 回调 范例 C++异步回调实现
这几天搞搞JNA,主要是组内小弟靠不住。 找了下资料,居然没有回调函数的样例,郁闷的我不行,于是就自己折腾一晚上,自己实现一个。 C++部分使用ACE实现了一个线程,线程中调用Java部分的回调函数。 C++使用vc8开发,代码跨平台,不过偷懒,没写makefile, 其中使用了ACE这个库。 Java部分,使用eclipse。jdk1.5版本。
客户端无刷新回调,ICallBackEverHandler实现客户端回调
客户端无刷新回调,采用.NET自带的ICallBackEverHandler实现客户端回调,服务器端无刷新回传,可以用来做类似用户名检测等。
回调是什么意思?回调是否就是指系统调用?
回调函数就是你自己写的系统调用的函数,那么回调是否就是指系统调用?
伪装微信支付回调通知之假回调
原理 1.微信支付成功后,微信会给业务服务器发送回调通知,回调内容为一系列 参数的键值对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串,然后用商户私钥对其进行签名,如MD5,并将签名撇接到字符串后,然后以XML方式发送给业务服务器,如果秘钥泄露,他人可任意伪造回调数据进行假通知,在业务服务器(1.没有更进一步判断IP是否来自微信服务器,2没有进行主动查询)的情况下订...
Java回调~mqtt回调处理中的问题
1. java回调机制 回调方法的理解: 例子:   消防员给出一个电话号码119(这是每个人都知道的,119就相当于Java中的一个接口),并在每一个地方都设置一个发生火灾时的检测装置,如果危急到人们的人生安全时,那么市民就可以打119给消防员让消防员来处理。
(初学者)回调技能学习之工具类执行回调
hello,大家好,我是超级康,是一名博客的新生,这篇博客是我的首篇技术博客,希望大家能学习到些许知识。     在公司上班接近半年的时间,关于回调这个技能,在项目中真的是屡见不鲜。接下来,我会就项目中工具类中所用到的回调进行一些总结。  为了能够贴切的感受回调,我们直接新建一个AndroidStudio项目 -- UploadCallbackDemo  张贴主界面activity_main
七牛文件上传回调以及解析回调参数
可参考七牛官网文档:https://developer.qiniu.com/kodo/sdk/1239/java 实现以下功能要引入七牛的sdk com.qiniu qiniu-java-sdk [7.0.0, 7.0.99] 这是上传的方法 private static void qiNiuUpLoad() { // 华东 Zon
web service 回调地址 回调事件
最近公司的一个项目需要用到电信的web service短信接口,里面需要第三方软件平台注册自己的web service并提供相应的回调事件接口,同时需要设置回调事件。我们是做C开发的,请问这个回调事件,设置回调地址回调事件是怎么回事啊
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数