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对象来解决这个问题。这里仅仅是个人猜想,没有得到验证。


1 0
原创粉丝点击