版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liwei16611/article/details/82223216
1、背景:
数据交互或设备操作如果处理不合适就不可避免要遇到异常,增加超时监控机制以便于对异常的及时处理。
2、定义 Handler
private Handler mHandler = new Handler();
3、定义线程
private Runnable mTimeOutRunnable = new Runnable() {
@Override
public void run() {
/* 超时处理 */
}
};
4、设置超时检测时间
mHandler.postDelayed( mTimeOutRunnable, 1 * 1000 ); // 超时检测时间 1s
5、取消超时回调函数
mHandler.removeCallbacks( mTimeOutRunnable );
6、示例
以笔者最近负责的 CC2541 BLE 为例
a、BLE 扫描过程属于高耗电过程,以华为手机为例(扫描过程信号明显弱于连接后信号),因此规定时间未扫描到设备需要停止扫描。
// 启动延时任务
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBluetoothAdapter.stopLeScan(mLeScanCallback); // 停止扫描
}
}, 1000*5); // 5s 未扫描到设备就停止
// 开始扫描
mBluetoothAdapter.startLeScan(mLeScanCallback);
b、连接设备时的超时处理
扫描到设备后急需要连接操作,也需要做好超时检测:
// 启动线程
private Runnable mConnTimeOutRunnable = new Runnable() {
@Override
public void run() {
disconnect(); // 资源释放
close();
}
};
// 5s 延时检测
mHandler.postDelayed(mConnTimeOutRunnable, 5*1000);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// 连接设备
mBluetoothGatt = device.connectGatt(BleCommService.this, false, mGattCallback);
}
}, 100);
// 删除回调函数
mHandler.removeCallbacks(mConnTimeOutRunnable);
c、通讯中的等待回复超时
超时后可以考虑重发机制的设计或丢弃数据
// 发送数据
mTxCharacteristic.setValue(data);
mBluetoothGatt.writeCharacteristic(mTxCharacteristic);
// 延时检测
mHandler.postDelayed(mClearMsgRunnable, 1000*5);
// 接收消息超时处理,通知所有listener超时并清空消息队列
private Runnable mClearMsgRunnable = new Runnable() {
@Override
public void run() {
List list = MsgReqListMgr.getInstance().getListeners();
if (list.size() > 0) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
MsgListener msg = iterator.next();
msg.mListener.onFailed(MsgErrCode.ERR_TIME_OUT);
}
ThreadMgr.getInstance().removeAll();
MsgReqListMgr.getInstance().clear();
}
MsgReqListMgr.getInstance().clear();
}
};
// 处理完 ACK 数据后删除
mHandler.removeCallbacks(mClearMsgRunnable);
refer:
https://blog.csdn.net/wujian946110509/article/details/53406219