Я тоже это заметил.Одна вещь, которую вы можете сделать, это проверить состояние BufferedReader в конце вашего цикла:
while((line = rd.readLine()) != null){
sb.append(line);
if (!rd.ready()) {
break;
}
}
rd.close();
Однако, ready () не гарантирует, что ваш поток находится в конце.Он только проверяет, заблокирован ли поток или закрыт.См. BufferedReader.ready () на developer.android.com
Я думаю, что это ошибка, представленная в Android OS 2.3 и выше.Пожалуйста, внесите свой вклад в базу ошибок на официальном сайте Android, чтобы Google решил эту проблему.К сожалению, уже есть много устройств, которые уже поставлялись с версиями ОС от 2.3 до 2.3.3.
Ваша ситуация заключается в том, что вы, вероятно, достигли конца файла за одно чтение, и поток автоматически закрывается.Я думаю, что это ошибка, представленная в Android 2.3 и выше.
Пост Glassonion будет работать, но этот обходной путь будет работать очень медленно на длинных потоках данных.
Поскольку мобильные приложения могут потерять подключение к Интернету в любое время, InputStream, с которого вы читаете, может быть просто заблокирован и ожидает дополнительных данных.
Более правильный подход может состоять в том, чтобы открыть сокет в новом потоке, прочитать данные и подождать с таймаутом, чтобы застраховаться от любой медлительности в вашем соединении.
Следующая статья объясняет, как правильно обрабатывать заблокированные соединения.Чтение сводки должно быть достаточно, чтобы убедить вас.
Все хорошие сетевые приложения будут включать в себя обнаружение и обработку тайм-аута.Независимо от того, пишете ли вы клиент, и вам нужно обнаружить ненормативную лексику, или вы пишете сервер, и вам нужно предотвращать остановленные соединения, обработка тайм-аута является важной частью обработки ошибок.