【发布时间】:2014-11-10 02:53:56
【问题描述】:
我有两个线程持续管理 BluetoothSocket 流上的 I/O 操作。
对于输入,没问题.. InputStream.read() 方法是阻塞的,一切都很好。
对于输出.. 问题来了。
public void write(final byte[] buffer) {
synchronized (this) {
try {
this.mOutStream.write(buffer);
this.mHandler.sendEmptyMessage(Constants.MESSAGE_SENT);
} catch (IOException e) {
Log.e(LOGTAG, "Exception during write", e);
}
}
}
我使用上面的代码在输出流上写入消息。它在线程实例上同步,因此没有其他人能够竞争性地在缓冲区上写入。
问题如下:如果我尝试编写两条消息,一条紧随另一条之后,接收设备似乎跳过了第一条。
看了OutputStream.write(byte[])做了什么,我明白了主要原因是什么:这就像调用OutputStream(byte[], 0, length),所以'0'偏移会覆盖之前的消息。
但我无法在每次需要顺序写入两条消息时设置计时器或超时,只是为了确保同时第一条消息已被收件人阅读。
我想要更多,像这样的:
int offset = 0;
this.mOutputStream.setOnStreamEmptiedCallback(new OnStreamEmptiedCallback() {
public void onStreamEmptied() {
this.offset = 0;
}
});
public void write(byte[] buffer) {
this.mOutputStream.write(buffer, 0, buffer.length);
this.offset += buffer.length;
}
我知道setOnStreamEmptiedCallback 不存在,但是.. 有没有办法做类似的事情?有什么东西可以确保我永远不会覆盖流内容?
谢谢大家..
【问题讨论】:
标签: java android bluetooth callback outputstream