En mi aplicación de Android, estoy tratando de extraer datos del servidor haciendo una solicitud POST.getHttpResponseCode() devuelve -1 en android 2.2
Estoy usando la clase HttpURLConnection
para realizar las solicitudes ya que HttpClient
de Apache ya no es mantenido por android.
Esto es lo que estoy haciendo.
private boolean callWS() {
try {
// To avoid the bug in httpurlconnection prior froyo which
// causes the getInputStream to return headers along with response
if (Build.VERSION.SDK_INT < 8)
System.setProperty("http.keepAlive", "false");
mHttpResponseCode = 0;
mErrorMessage = "";
// Initialize connection
URL connectURL = new URL(mServerUrl);
HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
conn.setReadTimeout(30000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
// Set some headers
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Accept-Encoding", "deflate, gzip");
connection.setRequestProperty("Content-Length", mParameters.length() + "");
// Connect to host
conn.connect();
// Write parameters to connection
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(mParameters);
writer.flush();
writer.close();
// Wait for http response code
mHttpResponseCode = conn.getResponseCode();
// Read response from connection
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int read = 0;
int bufSize = 1024;
byte[] buffer = new byte[bufSize];
while (true) {
read = bis.read(buffer);
if (read == -1)
break;
baf.append(buffer, 0, read);
}
// Decompress gzipped response
if (conn.getHeaderField("Content-Encoding") != null && conn.getHeaderField("Content-Encoding").contains("gzip"))
mResponseString = decompress(baf.toByteArray());
else
mResponseString = new String(baf.toByteArray());
mResponse.setResponse(mResponseString);
isWSCallSuccessfull = true;
} catch(UnknownHostException unknownHostException) {
isWSCallSuccessfull = false;
mErrorMessage = "Unknown host exception";
unknownHostException.printStackTrace();
mLogger.putStacktrace(unknownHostException);
} catch(SocketException socketException) {
isWSCallSuccessfull = false;
mErrorMessage = "Socket Exception";
socketException.printStackTrace();
mLogger.putStacktrace(socketException);
} catch(SocketTimeoutException socketTimeOutException) {
isWSCallSuccessfull = false;
mErrorMessage = "Socket Timeout Exception";
socketTimeOutException.printStackTrace();
mLogger.putStacktrace(socketTimeOutException);
} catch(SSLException sslException) {
isWSCallSuccessfull = false;
mErrorMessage = "SSL Exception";
sslException.printStackTrace();
mLogger.putStacktrace(sslException);
} catch(IOException ioException) {
isWSCallSuccessfull = false;
mErrorMessage = "IO Exception " + ioException.getMessage();
ioException.printStackTrace();
mLogger.putStacktrace(ioException);
}
mResponse.setHttpResponseCode(mHttpResponseCode);
mResponse.setErrorMessage(mErrorMessage);
mResponse.isWSCallSuccessful(isWSCallSuccessfull);
return isWSCallSuccessfull;
}
Esto funciona bien en todos los dispositivos excepto en los dispositivos con 2.2 (no lo intenté en 2.1).
En 2.2, funciona bien. Pero si dejo esta parte del código inactiva durante más de 30 segundos, me devuelve -1 como código de respuesta http la próxima vez.
Otra cosa a tener en cuenta es que esto solo ocurre con las URL HTTPS y no con las URL HTTP. No quiero usar la clase HttpsURLConnection porque a veces también quiero usar http.
No estoy cerrando la conexión solo para mantener viva la conexión. ¿Qué estoy haciendo mal?
hago Https conexiones se cierran automáticamente después de un cierto período de tiempo (si no se está transfiriendo nada, quiero decir)? Realmente no sé mucho sobre las conexiones https, así que esto puede ser totalmente incorrecto. (Volviéndolo a leer ni siquiera estoy seguro de que lo que dije tenga sentido, lol) –
-1 suele ser cuando una conexión falla por una razón que no está especificada por código HTTP; en su caso, suena como un tiempo de espera pero también podría hay una falla de resolución DNS, etc ... Ahora, en cuanto a _por qué_ una versión específica de Android se está agotando, no sé ... – Basic
Bueno, mi idea es si no estoy haciendo nada mal, entonces este es el único problema ¿conmigo? Debido a que busca en la web, no encontré a nadie que tenga este problema. – Enigma