I am trying to loop code inside a thread in order to check for new data form the server periodically. I am using InputStream.available()
in order to check if there are any bytes to be read. If so, I open a new Thread and try to read the data using BufferedReader
and then log it to the console.
In onCreate:
HandlerThread ht = new HandlerThread("CheckForData"); ht.start(); Looper checkForDataLooper = ht.getLooper(); checkForDataHandler = new Handler(checkForDataLooper); checkForDataHandler.post(checkForData);
The two runnables:
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(); } } };
The console:
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)
The 5th line in the console represents the moment when I send some data from the server. I can see that the number of bytes in the InputStream modifies, then the BufferedReader consumes them, but the data isn’t logged to the console. The exception throws when I force close the server.
PS. I am new to threading and networking so I apologize if this is some rookie mistake I am making.
Thank you.
Advertisement
Answer
I have found the answer:
The server wasn’t sending n
or r
at the end of the data and BufferedReader.readLine()
looks for one of these characters. As a result, the InputStream
was being read endlessly.