锁住数组,让队列按照顺序执行

public static class BleSendPackage {
 private byte[] characteristicData;
 private int characteristicCursor;
 private String address;
 public BleSendPackage(String address,byte[] characteristicData) {
  this.characteristicData = characteristicData;
  this.characteristicCursor = 0;
  this.address = address;
 }
}


private ArrayList<BleSendPackage> bleSendPackageList = new ArrayList<>(BleSendPackage);

 public void writeC5(final String address, final byte[] pktData){
        BleSendPackage bleSendPackage = new BleSendPackage(address,pktData);

        if( bleSendPackageList.size() == 0){//第一段数据,马上执行
            synchronized( bleSendPackageList ) {
                bleSendPackageList.add(bleSendPackage);
            }
            writeBleCharacteristicIfRemained(address);
        }else{//其他数据,延时执行
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized( bleSendPackageList ) {
                        bleSendPackageList.add(bleSendPackage);
                    }

                    writeBleCharacteristicIfRemained(address);
                }
            }).start();
        }
    }
  private void writeBleCharacteristicIfRemained(String address) {
        synchronized( bleSendPackageList ) {
            if(bleSendPackageList.size() != 0){
                BleSendPackage bleSendPackage = bleSendPackageList.get(0);
                boolean bwrite=false;
                BluetoothGattCharacteristic writeCharacteristic = getBlueDtoWriteCharacteristic(address);
                BluetoothGatt gatt = getBlueDtoBluetoothGatt(address);
                if (writeCharacteristic == null || gatt == null){
                    //TODO:需要告诉调用者消息异常处理
                    AppLog.Loge("dcgble","write characteristic cannot find");
                    return ;
                }
                if(BlueOper.this.mtu <= 3){
                    BlueOper.this.mtu = BLE_MTU_DEFAULT;
                }
                int availableTransmitLength = BlueOper.this.mtu - 3;
                int lastCursor = bleSendPackage.characteristicCursor;
                int fragLength = (bleSendPackage.characteristicCursor + availableTransmitLength <= bleSendPackage.characteristicData.length)
                        ? availableTransmitLength
                        : (bleSendPackage.characteristicData.length - bleSendPackage.characteristicCursor);

                try {
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    out.write(bleSendPackage.characteristicData, lastCursor, fragLength);
                    AppLog.Loge("dcgble_Data","lastCursor:"+lastCursor+"----fragLength:"+fragLength+"---数据length:"+bleSendPackage.characteristicData.length);
                    writeCharacteristic.setValue(out.toByteArray());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //订阅通知
                boolean notification =gatt.setCharacteristicNotification(writeCharacteristic, true);
                writeCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
                bwrite = gatt.writeCharacteristic(writeCharacteristic);
                AppLog.Loge("dcgble_Data","指令写入结果"+bwrite);

                bleSendPackage.characteristicCursor += fragLength;
                if( bleSendPackage.characteristicCursor == bleSendPackage.characteristicData.length ) {
                    bleSendPackageList.remove(0);//执行完成,移出队列
                    AppLog.Loge("dcgble","指令发送结束");
                }
            } else {
                sendCompletedEvent();
            }
        }
    }
    private void sendCompletedEvent() {
        if(netstrapService!=null && netstrapService.isOtaStarted() ) {
            netstrapService.addTask(new NetstrapTask(NetstrapState.OTA_SEND));
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值