Kotlin readBytes() 永远不会完成
Kotlin readBytes() never completes
我只是想通过蓝牙套接字写入和读取,但我的 readBytes 调用没有完成。我认为这很简单,但也许我只是使用了错误类型的流或其他东西。截至目前,我的代码只是以字节形式发送少量文本。这是占位符代码,将替换为通过流写入和读取文件的代码。这是我的接收线程:
class ReceiveThread(val inStream:BufferedInputStream):Thread() {
var bytes:ByteArray? = null
override fun run() {
BluetoothService.log("Begin ${BTS_Constants.THREAD_RECEIVE}")
BluetoothService.log("preparing to read data")
name = BTS_Constants.THREAD_RECEIVE
//here is my new code
inStream.use {
do{
count++
BluetoothService.log("read loop round $count")
byteList.add(it.read() as Byte)
}while (it.available()>0)
}
BluetoothService.log("data read: ${byteList.get(0) as Char}")
}
}
这是我的发送线程:
class SendThread(val outStream:BufferedOutputStream, val file:File? = null):Thread(){
var bytes:ByteArray? = null
override fun run() {
BluetoothService.log("Begin : ${BTS_Constants.THREAD_SEND}")
name = BTS_Constants.THREAD_SEND
bytes = "hello testing".toByteArray()
try{
outStream.use {
it.write(bytes)
it.flush()
}
}catch (ioe:IOException){
}
BluetoothService.log("data sent")
}
}
数据已成功发送,BluetoothService.log("data sent")
调用已到达并显示在 logcat 设备 运行 发送线程中。对于设备 运行,接收线程记录 "Preparing to read data" 消息,但从不记录 data read: "$bytes message"
。
如何完成对 inStream.readBytes() 的调用?
编辑:我收到的新错误消息:
11-27 23:45:29.298 16253-16413/com.example.zemcd.fileblue E/AndroidRuntime: FATAL EXCEPTION: RECEIVE
Process: com.example.zemcd.fileblue, PID: 16253
java.io.IOException: bt socket closed, read return: -1
at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:588)
at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
at com.example.zemcd.fileblue.ReceiveThread.run(BluetoothService.kt:230)
如果您查看 Kotlin 扩展函数的源代码 readBytes
you see that it starts loop while InputStream.read(buffer) > 0
. According to documentation:
This method blocks until input data is available, end of file is detected, or an exception is thrown.
此循环的第二次迭代会冻结您的程序。
所以不要使用方法readBytes
。就 read(buffer)
。
例如 - https://developer.android.com/guide/topics/connectivity/bluetooth.html#ManagingAConnection
更新:
现在ReceiveThread
可以从流中接收一条消息。但是你的蓝牙插座很近。所以你的问题在于设置蓝牙连接和 inStream
的初始化。可能你发送的部分也错了。
我只是想通过蓝牙套接字写入和读取,但我的 readBytes 调用没有完成。我认为这很简单,但也许我只是使用了错误类型的流或其他东西。截至目前,我的代码只是以字节形式发送少量文本。这是占位符代码,将替换为通过流写入和读取文件的代码。这是我的接收线程:
class ReceiveThread(val inStream:BufferedInputStream):Thread() {
var bytes:ByteArray? = null
override fun run() {
BluetoothService.log("Begin ${BTS_Constants.THREAD_RECEIVE}")
BluetoothService.log("preparing to read data")
name = BTS_Constants.THREAD_RECEIVE
//here is my new code
inStream.use {
do{
count++
BluetoothService.log("read loop round $count")
byteList.add(it.read() as Byte)
}while (it.available()>0)
}
BluetoothService.log("data read: ${byteList.get(0) as Char}")
}
}
这是我的发送线程:
class SendThread(val outStream:BufferedOutputStream, val file:File? = null):Thread(){
var bytes:ByteArray? = null
override fun run() {
BluetoothService.log("Begin : ${BTS_Constants.THREAD_SEND}")
name = BTS_Constants.THREAD_SEND
bytes = "hello testing".toByteArray()
try{
outStream.use {
it.write(bytes)
it.flush()
}
}catch (ioe:IOException){
}
BluetoothService.log("data sent")
}
}
数据已成功发送,BluetoothService.log("data sent")
调用已到达并显示在 logcat 设备 运行 发送线程中。对于设备 运行,接收线程记录 "Preparing to read data" 消息,但从不记录 data read: "$bytes message"
。
如何完成对 inStream.readBytes() 的调用?
编辑:我收到的新错误消息:
11-27 23:45:29.298 16253-16413/com.example.zemcd.fileblue E/AndroidRuntime: FATAL EXCEPTION: RECEIVE
Process: com.example.zemcd.fileblue, PID: 16253
java.io.IOException: bt socket closed, read return: -1
at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:588)
at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
at com.example.zemcd.fileblue.ReceiveThread.run(BluetoothService.kt:230)
如果您查看 Kotlin 扩展函数的源代码 readBytes
you see that it starts loop while InputStream.read(buffer) > 0
. According to documentation:
This method blocks until input data is available, end of file is detected, or an exception is thrown.
此循环的第二次迭代会冻结您的程序。
所以不要使用方法readBytes
。就 read(buffer)
。
例如 - https://developer.android.com/guide/topics/connectivity/bluetooth.html#ManagingAConnection
更新:
现在ReceiveThread
可以从流中接收一条消息。但是你的蓝牙插座很近。所以你的问题在于设置蓝牙连接和 inStream
的初始化。可能你发送的部分也错了。