realmente necesito un poco más de información acerca de cómo leer la respuesta de HttpUrlConnection clase en el SDK de Android. Estoy tratando de leer una respuesta desde el servidor web,pero cuando es demasiado grande mis aplicaciones se saque un OutOfMemoryException. Por lo que cualquier fuente/ayuda/sugerencias sobre cómo leer la respuesta completa en pedazos es bienvenida.

Como ya he hecho una investigación, he encontrado que me debería de poner algo como esto : ((HttpURLConnection) connection).setChunkedStreamingMode(1024); Pero mi problema es que no sé cómo leer este chuncked corriente. Así que voy a ser muy feliz si alguien me puede orientar a través de la manera correcta.

Gracias!

Código De Ejemplo :

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);
}
  • Podría publicar algo de código de ejemplo. Esto hace que sea más fácil de explicar qué hacer en su situación específica.
  • Acabo de añadir el código que estoy utilizando para enviar los parámetros y conectar con el servidor y la realidad que muestra el cuerpo de la respuesta.

2 Comentarios

  1. 3

    Simplemente asignar un búfer de bytes que puede contener una pequeña cantidad de datos y lectura de la secuencia de entrada en este búfer (utilizando el leer método). Algo así como:

    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
    }
    • Que el código que se saque me FileNotFoundException en esa línea : InputStream response = connection.getInputStream();. Alguna idea de por qué?
    • Tal vez la URL que proporcionan no es correcta (probarlo en un navegador). También, el código que has pegado no se lee desde la URL, pero se escribe en él (envía los datos al servidor y no recibe ninguna). Mi código lee la respuesta desde el servidor.
    • sí, en realidad tengo para publicar algunos datos y, a continuación, leer la respuesta desde el servidor, dependiendo de los datos que enviar.
    • Acabo de editar mi código y puedo decir que no estoy recibiendo todo el inputstream.Puedo recibir sólo 8*1024 y que nada.
    • Este código funciona, compruebe que una Excepción no son arrojados, que vendría a romper el bucle while.
  2. 2

    A leer el Encabezado de Respuesta pruebe a utilizar :

    String sHeaderValue = connection.getHeaderField("Your_Header_Key");

Dejar respuesta

Please enter your comment!
Please enter your name here