Android HttpUrlConnection how to read response into pieces

12,174

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");
Share:
12,174
Android-Droid
Author by

Android-Droid

Android developer.

Updated on June 08, 2022

Comments

  • Android-Droid
    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 an OutOfMemoryException. 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&timestamp=%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);
                }