【Android】小白进阶之如何为产品设计超时监控机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/liwei16611/article/details/82223216