【问题标题】:Android - How to listen for Bluetooth output stream to be emptiedAndroid - 如何监听蓝牙输出流被清空
【发布时间】: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


    【解决方案1】:

    flush() 应该可以解决您的问题。

    this.mOutStream.write(buffer);
    this.mOutStream.flush();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多