while (available() == 0) {
delay(10)
}
Здесь вы надеетесь, что достигли неблокирующего ввода-вывода с помощью InputStream
. Вы представляете, что данные будут каким-то образом «накапливаться» сами по себе, и вы можете просто подождать, пока они станут доступными, чтобы вы могли получить их, не блокируя при последующем вызове read()
.
Это поведение не универсально для любого InputStream
. На самом деле, он, вероятно, работает только с SocketInputStream
и там также есть проблемы: когда удаленный конец закрыл соединение, он будет возвращать 0
, пока вы не сделаете еще один вызов read
, чтобы убедиться, что сокет закрыт .
В других реализациях InputStream
, available()
всегда будет возвращать 0, если поток не буферизован, в этом случае он просто скажет вам, сколько осталось в буфере. Когда буфер пуст, реализация входного потока не будет пытаться получить больше данных из базового ресурса, пока вы не вызовете read()
.
Поэтому я бы предложил по крайней мере сузить приемник вашей функции до SocketInputStream
, но для полной корректности вы должны использовать вместо этого код NIO.
Наконец, если вы обнаружите, что для вашего конкретного случая использования цикл available()
работает должным образом и read()
никогда не блокируется, то вам следует отбросить withContext(IO)
, поскольку это подразумевает два дорогостоящих переключения контекста (в фоновый поток и обратно), и его целью является только запуск блокирования кода из потока GUI.