Ich versuche nur über eine Bluetooth-Buchse zu schreiben und zu lesen, aber ich lese mein readBytes-Aufruf nicht aus. Ich denke, dass das sehr einfach ist, aber vielleicht verwende ich nur den falschen Typ von Stream oder etwas. Momentan sendet mein Code nur eine kleine Menge Text als Bytes. Dies ist Platzhaltercode, der durch Code ersetzt wird, der eine Datei über den Stream schreibt und liest. Hier ist mein Receive Thema:Kotlin readBytes() beendet nie
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}")
}
}
und hier ist mein Senden Thema:
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")
}
}
die Daten erfolgreich gesendet werden, und der BluetoothService.log("data sent")
Anruf erreicht ist und in der logcat für das Gerät angezeigt, der ausgeführt wird ein Sende-Thread Für das Gerät, das ausgeführt wird, protokolliert der Empfangs-Thread die Meldung "Vorbereiten des Lesens von Daten", protokolliert jedoch niemals data read: "$bytes message"
.
Wie kann ich diesen Aufruf von inStream.readBytes() abgeschlossen machen?
Edit: neue Fehlermeldung, die ich empfangen habe:
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)
danke. Diese Antwort ist sehr informativ, aber ich habe die Änderungen am Code vorgenommen und es blockiert immer noch. Vielleicht verstehe ich das falsch. Ich änderte 'bytes = it.readBytes()' in 'byteSize = it.read (buffer)' und fügte meinem Code eine byteSize-Variable hinzu. als ein Int-Feld meines Empfangs-Threads. Muß ich etwas mehr tun? Ich sehe nicht mehr in der Dokumentation und weil ich kotlin benutze, kann ich nicht die 'while ((byteSize = it.read (buffer))! = - 1) Schleife. –
@Mox_z Sind Sie sicher, dass die ReceiveThread-Aufrufmethode vor dem Schreiben der SendThread-Aufrufmethode gelesen wurde? –
Ja, die Schreibseite vervollständigt das Senden. aber könnte das etwas damit zu tun haben, dass es ein BufferedInputStream ist? Gibt es dort eine andere Technik? –