2

Bluetooth経由でサーマルプリンターと通信してデータを印刷するアプリケーションがあります。

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();

ご覧のとおり、フラッシュを呼び出してすべてのデータが書き込まれるようにし、ストリームを閉じてからソケットを閉じます。

ただし、実際に起こると思うのは、すべてが正常に印刷される前であっても、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 に答える