Android蓝牙通信使用obtainMessage数据丢失
来源:互联网 发布:ubuntu怎么查看用户名 编辑:程序博客网 时间:2024/05/22 08:28
最近开始弄蓝牙,参考google的官方demo,通信源码大致如下:
handler消息发送部分:
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
handler消息接收部分:
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
按照这种方式,结果悲剧发生了,当传输速度变快时,在UI线程中出现了部分数据丢失的情况。于是,开始怀疑是否与obtainMessage这种通信方式有关系。
本人接触Android开发和java不久,主要是做c开发的,因此暂时也弄不清楚具体原因。采用下面的方法暂时解决问题。
handler消息发送部分:
Message msg = new Message();
Bundle data = new Bundle();
data.putString("zjh", readMessage);
msg.what = MESSAGE_READ;
msg.setData(data);
mHandler.sendMessage(msg);
handler消息接收部分:
Bundle data = msg.getData();
String readMessage = data.getString("zjh");
通过这样的方式,暂时解决了数据丢失的问题,不知道有没有从根本上解决这个问题。
下面说说自己的猜想,以及疑惑,希望有心人事指导一下。
在网上查阅资料,谈到obtainMessage和sendMessage的主要区别是,obtainMessage从全局对象池中取出Message对象,而sendMessage则是new一个新的对象,因此,在效率方面来说obtainMessage的效率更高(毕竟申请了大量的new操作)。因此,我怀疑在快速通信时,是不是在从全局对象池中取Message对象,覆盖了发送到UI线程中的消息队列中的对象,从而导致数据丢失的情况。因此全部改为new出新的Message对象来解决这个问题。这里仅仅是个人猜想,没有得到验证。
- Android蓝牙通信使用obtainMessage数据丢失
- Android蓝牙通信——安卓蓝牙obtainMessage数据传输部分数据丢失乱序问题
- Android 蓝牙开发-蓝牙通信
- Android----蓝牙通信使用 不同手机下同一应用通信
- Android蓝牙通信——与蓝牙模块进行通信传输数据
- Android 蓝牙通信开发(三)蓝牙通信
- Android蓝牙通信
- Android蓝牙通信
- android 蓝牙通信编程
- Android蓝牙通信
- Android 通信--蓝牙
- Android 通信--蓝牙
- Android蓝牙通信
- Android-蓝牙通信
- Android BlueTooth蓝牙通信
- 关于android蓝牙通信
- android蓝牙通信
- android 蓝牙通信编程
- windows下slickedit BUILD窗口中文显示乱码的解决方法
- linode vpn 搭建
- SQL2000数据库查询讲解010--使用集函数
- 我已经折腾Objective-C一年多
- 黑苹果各种奇怪故障,插入USB设备引导失败故障。
- Android蓝牙通信使用obtainMessage数据丢失
- 【C++基础之二十】可变参数的函数
- 第一时间捕获段错误(segment fault)的详细信息
- 使用xfire方式调用webservice接口
- jstl标签fn:substring使用技巧 和 JSTL中fn表达式的使用说明
- win7下 一键ghost/一键还原软件卸载后 删除相关开机启动选项
- 欲让其灭亡,币让其疯狂
- UIView给控件边框加阴影
- 'MsmqTransportConfig' section is obsolete