Android HttpUrlConnection how to read response into pieces
Solution 1
Simply allocate a byte buffer that can hold a small amount of data and read from the input stream into this buffer (using the read method). Something like:
InputStream is = connection.getInputStream();
int bytesRead = -1;
byte[] buffer = new byte[1024];
while ((bytesRead = is.read(buffer)) >= 0) {
// process the buffer, "bytesRead" have been read, no more, no less
}
Solution 2
To read the Response Header try to use :
String sHeaderValue = connection.getHeaderField("Your_Header_Key");
Comments
-
Android-Droid almost 2 years
actually I need a little more information about how to read response from
HttpUrlConnection
class in Android SDK. I'm trying to read a response from web server,but when it's too big my applications is throwin anOutOfMemoryException
. So any source/help/suggestions on how to read the whole response into pieces is welcomed.As I made a research I found out that I should set something like this :
((HttpURLConnection) connection).setChunkedStreamingMode(1024);
But my problem is that I don't know how to read this chuncked stream. So I'll be very happy if someone can guide me through the right way.Thanks!
Sample Code :
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); String deviceId = tm.getDeviceId(); Log.w("device_identificator","device_identificator : "+deviceId); String resolution = Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getWidth())+ "x" + Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getHeight()); Log.w("device_resolution","device_resolution : "+resolution); String version = "Android " + Build.VERSION.RELEASE; Log.w("device_os_type","device_os_type : "+version); Log.w("device_identification_string","device_identification_string : "+version); String locale = getResources().getConfiguration().locale.toString(); Log.w("set_locale","set_locale : "+locale); String clientApiVersion = null; PackageManager pm = this.getPackageManager(); PackageInfo packageInfo; packageInfo = pm.getPackageInfo(this.getPackageName(), 0); clientApiVersion = packageInfo.versionName; Log.w("client_api_ver","client_api_ver : "+clientApiVersion); long timestamp = System.currentTimeMillis()/1000; String timeStamp = Long.toString(timestamp); String url = "http://www.rpc.shutdown.com"; String charset = "UTF-8"; String usernameHash = hashUser(username,password); String passwordHash = hashPass(username,password); String query = String.format("username_hash=%s&password_hash=%s&new_auth_data=%s&debug_data=%s&client_api_ver=%s&set_locale=%s×tamp=%s&"+ "device_os_type=%s&mobile_imei=%s&device_sync_type=%s&device_identification_string=%s&device_identificator=%s&device_resolution=%s", URLEncoder.encode(usernameHash, charset), URLEncoder.encode(passwordHash, charset), URLEncoder.encode("1", charset), URLEncoder.encode("1", charset), URLEncoder.encode(clientApiVersion, charset), URLEncoder.encode(locale, charset), URLEncoder.encode(timeStamp, charset), URLEncoder.encode(version, charset), URLEncoder.encode(deviceId, charset), URLEncoder.encode("14", charset), URLEncoder.encode(version, charset), URLEncoder.encode(deviceId, charset), URLEncoder.encode(resolution, charset)); HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setDoOutput(true); // Triggers POST. connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", charset); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); OutputStream output = null; try { output = connection.getOutputStream(); output.write(query.getBytes(charset)); } catch (IOException e) { e.printStackTrace(); } finally { if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} } int status = ((HttpURLConnection) connection).getResponseCode(); Log.i("","Status : "+status); for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { Log.i("Headers","Headers : "+header.getKey() + "=" + header.getValue()); } InputStream response = connection.getInputStream(); Log.i("","Response : "+response.toString()); int bytesRead = -1; byte[] buffer = new byte[8*1024]; while ((bytesRead = response.read(buffer)) >= 0) { String line = new String(buffer, "UTF-8"); Log.i("","line : "+line); handleDataFromSync(buffer); }