0
private byte[] sendCommand (byte[] command){ 
     try { 
      nos.write(command); 
      nos.flush(); 

      byte[] buffer = new byte[4096]; 
      int read; 
      while ((read = nis.read(buffer, 0, 4096)) > 0 && isConnecting) { 
       // Read the response 
       temp_data = new byte[read]; 
       System.arraycopy(buffer, 0, temp_data, 0, read); 
      } 

Ich rufe sendCommand dreimal in meinem doInBackground(). Ich erwarte 13 Bytes Antwort nach dem Senden eines ersten Befehls, dann ein Byte in meinem zweiten und dann etwa 1kB in meinem dritten.asynctask lesen blockieren

Frage 1: Der erste Aufruf von sendCommand() liest 13 Bytes als Antwort, aber die gelesenen Blöcke in der while-Bedingung, weil es keine Daten mehr gibt. Wie kann ich es ohne Blockierung laufen lassen?

Frage 2: Ist es möglich, wiederholtes Schreiben und Lesen in einem Thread zu senden? Da für den zweiten Aufruf von sendCommand(), bekomme ich das gleiche 13 Byte nicht 1 Byte Antwort. Ich frage mich, ob der Ausgabestrom den Befehl nicht korrekt sendet.

+0

Ich kann keine Logik in Ihrer Leseschleife sehen, die dazu führen würde, dass sie beendet wird. Ist das Ihr tatsächlicher Code oder haben Sie ihn bearbeitet? – teppic

+0

Es ist mein tatsächlicher Code. Es wird beendet, wenn der Wert -1 ist. In der ersten while-Schleife wird 13 gelesen und wenn es das zweite Mal umgeht, wird es für einige Zeit blockiert und dann mit -1 beendet – juysw

Antwort

0

I der while-Schleife erhalten hatte zu befreien, damit ich nur einmal gelesen. Ich verstehe immer noch nicht, warum es die While-Schleife nicht sofort beenden würde, aber das Entfernen der Schleife funktioniert für die mittlere Zeit.

0

Ihr Lesevorgang wird blockiert, weil Sie ihn aufgefordert haben, 4k Bytes abzurufen. Während es kann zurückgeben vor dem Lesen aller angeforderten Bytes, wird es auf dem Weg dazu blockieren. Sie sollten nur versuchen, die Anzahl von Bytes zu lesen, die Sie erwarten: