Трудно сказать, что происходит, не видя больше вашего кода, но вот мой вывод о том, что здесь происходит (я сделал довольно много сокет-программирования в приложениях для Android):
Вы создаете Socket и оборачиваете входной поток в BufferedReader в главном потоке приложения, а затем создаете новый поток, чтобы дождаться получения ввода в сокете и последующей обработки этого ввода. Однако, когда вы создаете новый поток, этот код начинает выполняться в фоновом режиме, и тем временем метод, в котором все это происходит (метод, в котором вы объявляете Socket и BufferedReader), заканчивается! Когда этот метод завершается, больше нет ссылки на Socket, поэтому он закрывается и собирается сборщиком мусора во время выполнения. К сожалению, ваш фоновый поток не знает, что его сокет был закрыт в это время, поэтому readLine () в итоге выдает исключение, утверждающее, что сокет (fileno, unix-wise) теперь «плохой», так как он был закрыт во время выполнения.
Вы изначально были правы, предполагая, что цикл while может это исправить, и это будет сделано, потому что он не позволит завершить метод, тем самым оставляя Socket открытым, но проблема в том, что весь пользовательский интерфейс зависает, пока ваш приложение ожидает ввода от сокета.
Истинное решение этой проблемы - все обмен данными через сокет в службе, работающей в отдельном потоке от пользовательского интерфейса приложения.
Я приложил все усилия, чтобы объяснить это, но если какие-то части неясны, просто прокомментируйте, и я постараюсь объяснить дальше или оказать вам более конкретную помощь.