Android - 在刷新OutputStream之前执行蓝牙套接字关闭命令

时间:2013-08-31 13:43:50

标签: android sockets bluetooth

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

我写入outputStream,flush以确保每个数据都被写入,然后关闭套接字。然而,实际发生的是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实际上已刷新/为空?我查看了蓝牙套接字和OutputStream的文档,似乎没有一种直接的方式来做我想要的。

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

2 个答案:

答案 0 :(得分:0)

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

您是否有任何实际的证据,因为您的奇怪信念是您的程序没有按照书面顺序执行。

我会尝试删除套接字关闭。

答案 1 :(得分: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