BufferedReader застревает, когда вывод пуст - PullRequest
0 голосов
/ 10 ноября 2019

Я использовал BufferedReader для обработки вывода веб-страницы. Когда выходные данные веб-страницы пусты (я использовал Response.Clear на веб-стороне), последняя строка Log.e("status","finish") ничего не делает. reader.readLine() застрял в пустом выводе? Если да, как я должен проверить, является ли ответ пустым, прежде чем использовать ридер ?

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); 
connection.setRequestProperty("Accept-Charset", "utf-8");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + "utf-8");
connection.connect(); // The code works same without this. Do I need this?
try (OutputStream output = connection.getOutputStream()) {
    output.write(query.getBytes("utf-8"));
    Log.e("status", "post Done"); // This works
}
InputStream response = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));

String line="";
while ((line = reader.readLine()) != null) {
    urlData += line;
}
reader.close();

Log.e("status","finish");

1 Ответ

1 голос
/ 10 ноября 2019

Да, он «застрял», хотя правильная формулировка такова, что он «заблокирован». Он блокируется, пока не получит строку текста. Когда сокет закрыт на другой стороне, соединение TCP будет указывать на завершение, и входной поток закрывается. В этот момент вы получите null, как указано в API. Однако до того, как это произойдет, подпрограмма высокого уровня readLine будет радостно ждать до конца времени или до тех пор, пока нижний уровень не сгенерирует тайм-аут.

Таким образом, это может быть не очень хорошей идеей. использовать readLine или даже потоковую передачу, если вы не доверяете своему соединению с сервером для возврата каких-либо данных. Однако вы можете установить сокет на тайм-аут и сгенерировать исключение вместо этого, используя Socket.html#setSoTimeout(int) - если вы считаете, что сервер не отвечает, является исключительной проблемой.

...