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

Я вызываю sendCommand три раза в моем doInBackground(). Я ожидаю, что 13 байтов ответа будут отправлены после отправки первой команды, а затем один байт в моей второй, а затем около 1 кБ в моей третьей.asynctask read blocking

Вопрос 1: Первый вызов sendCommand() считывает 13 байт в ответ, но считывает блоки в состоянии while, потому что данных больше нет. Как я могу запустить его без блокировки?

Вопрос 2: Возможно ли повторить запись и чтение в одном потоке? Потому что для второго вызова sendCommand() я получаю тот же 13-байтовый, а не 1 байт ответа. Интересно, не возвращает ли выходной поток команду.

+0

Я не вижу никакой логики в вашем цикле чтения, которая заставит его выйти. Это ваш фактический код, или вы его отредактировали? – teppic

+0

Это мой фактический код. Он выдается, когда чтение равно -1. read - 13 в первом цикле while и когда он второй раз вокруг него блокирует некоторое время, то выходит с -1 – juysw

ответ

0

Я должен был избавиться от цикла в то время, так что я прочитал только один раз. Я до сих пор не понимаю, почему это не закончит цикл while, но удаление цикла работает в течение среднего времени.

0

Ваше чтение блокируется, потому что вы попросили его получить 4k байт. Пока он может вернуть, прежде чем читать все запрошенные байты, он будет блокироваться на пути к этому. Вы должны попытаться прочитать только число байтов, которые вы ожидаете: