2

我有一个通过蓝牙与热敏打印机通信并打印数据的应用程序。

我写入 outputStream,刷新以确保写入每个数据,然后关闭套接字。然而,实际发生的是 socket.close() 命令在所有内容都打印出来之前执行,所以打印输出被剪切了。

这是我写数据的顺序(它在一个巨大的 try-finally 块中):

//open socket here, assign outputStream, write data to be printed


//after all those mmOutStream.write() statements, these are on the finally statement
mmOutStream.flush();

mmOutStream.close();
socket.close();

如您所见,我调用 flush 以确保写入所有数据,我关闭流,然后关闭套接字。

但是,我认为实际发生的是 socket.close() 语句甚至在所有内容都打印成功之前就被执行了。

到目前为止,我所做的是在 close 语句之前放置一个 Thread.sleep() 命令,但这不是我想要的解决方案。

有谁知道如何在关闭套接字之前确保 OutputStream 实际被刷新/清空?我查看了 Bluetooth Socket 和 OutputStream 的文档,似乎没有一种直接的方法可以做我想做的事。

任何想法都会有所帮助。谢谢。

4

2 回答 2

0

关闭套接字的输出流会刷新它并关闭套接字。关闭套接字本身是多余的。在您的实际代码中,它根本不应该做任何事情,因此在它之前添加一个睡眠应该只是浪费时间。

您是否有任何实际证据表明您的奇怪信念是您的程序没有按所写的顺序执行。

我会尝试关闭套接字。

于 2013-09-02T10:20:03.470 回答
0

我认为这是从 4.​​2.3 开始修复的。在此之前,BluetoothOutputStream 使用了 OutputStream 中 flush() 的默认实现,它什么都不做。

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4.4_r2/core/java/android/bluetooth/BluetoothOutputStream.java

于 2014-07-26T08:25:46.220 回答