
【Android】小白进阶之如何为产品设计超时监控机制
发布日期:2021-05-08 10:09:24
浏览次数:24
分类:原创文章
本文共 1953 字,大约阅读时间需要 6 分钟。
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
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月05日 23时04分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2019-03-06
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2019-03-06
如何查看jsplumb.js的API文档(YUIdoc的基本使用)
2019-03-06
大前端的自动化工厂(1)——Yeoman
2019-03-06
数据仓库建模方法论
2019-03-06
数据仓库之拉链表
2019-03-06
虚拟机搭建hadoop环境
2019-03-06
DataStax Bulk Loader教程(四)
2019-03-06
物联网、5G世界与大数据管理
2019-03-06
Cassandra与Kubernetes
2019-03-06
.NET应用框架架构设计实践 - 概述
2019-03-06
比Django官方实现更好的分页组件+Bootstrap整合
2019-03-06
Rust 内置 trait :PartialEq 和 Eq
2019-03-06
Hibernate(十四)抓取策略
2019-03-06
Mybatis入门之增删改查
2019-03-06
[菜鸟的设计模式之旅]观察者模式
2019-03-06
Spring-继承JdbcDaoSupport类后简化配置文件内容
2019-03-06
Java基础IO流(一)
2019-03-06
Hibernate入门(二)——hibernateAPI详解
2019-03-06