![](/img/trans.png)
[英]BufferedReader readLine() waiting for ever reading from Process inputStream
[英]Android Socket BufferedReader readLine() not working when reading from the InputStream
我試圖在線程內循環代碼,以便定期檢查來自服務器的新數據。 我正在使用InputStream.available()
來檢查是否有任何要讀取的字節。 如果是這樣,我打開一個新線程並嘗試使用BufferedReader
讀取數據,然后將其記錄到控制台。
在 onCreate 中:
HandlerThread ht = new HandlerThread("CheckForData");
ht.start();
Looper checkForDataLooper = ht.getLooper();
checkForDataHandler = new Handler(checkForDataLooper);
checkForDataHandler.post(checkForData);
兩個可運行的:
Runnable checkForData = new Runnable() {
@Override
public void run() {
try {
Log.d("Count", "run: " + inputStream.available());
if (inputStream.available() > 0) {
checkForDataHandler.removeCallbacks(checkForData);
new Thread(parseData).start();
}
}
catch (Exception e) {
Log.e("Exception", "run: " + e);
}
checkForDataHandler.postDelayed(checkForData, 3000);
}
};
Runnable parseData = new Runnable() {
@Override
public void run() {
String line = null;
StringBuilder data = new StringBuilder();
try {
while ((line = in.readLine()) != null) {
data.append(line);
}
Log.d("PARSED DATA", "run: " + data);
}
catch (Exception e) {
e.printStackTrace();
}
}
};
控制台:
D/Count: run: 0
D/AwareBitmapCacher: handleInit switch not opened pid=26256
D/Count: run: 0
D/Count: run: 0
D/Count: run: 4
D/Count: run: 0
D/Count: run: 0
D/Count: run: 0
D/Count: run: 0
W/System.err: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:215)
at java.net.SocketInputStream.read(SocketInputStream.java:144)
W/System.err: at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:291)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:355)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:181)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:172)
at java.io.BufferedReader.readLine(BufferedReader.java:335)
at java.io.BufferedReader.readLine(BufferedReader.java:400)
W/System.err: at com.bitline.httpcomtest.MainActivity$3.run(MainActivity.java:121)
at java.lang.Thread.run(Thread.java:929)
控制台中的第 5 行代表我從服務器發送一些數據的時刻。 我可以看到 InputStream 中的字節數修改,然后 BufferedReader 使用它們,但數據沒有記錄到控制台。 當我強制關閉服務器時拋出異常。
附注。 我是線程和網絡的新手,所以如果這是我犯的一些新手錯誤,我深表歉意。
謝謝你。
我找到了答案:服務器沒有在數據末尾發送\\n
或\\r
並且BufferedReader.readLine()
查找這些字符之一。 結果, InputStream
被無休止地讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.