2017-11-28 4 views
1

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) 

Antwort

2

Wenn Sie auf Quelle aussehen Kotlin Erweiterungsfunktion readBytes Sie sehen, dass es Schleife während InputStream.read(buffer) > 0 beginnt. Gemäß documentation:

Diese Methode blockiert, bis Eingabedaten verfügbar sind, das Dateiende erkannt wird oder eine Ausnahme ausgelöst wird.

Zweite Iteration dieser Schleife frieren Ihr Programm ein. Verwenden Sie also nicht die Methode readBytes. Nur read(buffer). Zum Beispiel - https://developer.android.com/guide/topics/connectivity/bluetooth.html#ManagingAConnection

Update:

Jetzt ReceiveThread eine Nachricht aus dem Strom empfangen kann. Aber deine Bluetooth-Steckdose ist in der Nähe. So ist Ihr Problem in der Einrichtung Bluetooth-Verbindung und inStream Initialisierung. Vielleicht hast du auch einen falschen Teil.

+0

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. –

+0

@Mox_z Sind Sie sicher, dass die ReceiveThread-Aufrufmethode vor dem Schreiben der SendThread-Aufrufmethode gelesen wurde? –

+0

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? –

Verwandte Themen