HttpsURLConnection y conexiones intermitentes

Espero que alguien me ayude con conexiones intermitentes que estoy recibiendo usando código con HttpsURLConnection. El código que estoy usando está abajo:

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setReadTimeout(10 * 1000); if conn.getResponseCode() != 200) { Log.v(TAG, "error code:" + conn.getResponseCode()); } 

La conexión funciona la primera vez cada vez que la uso para extraer un archivo json. Sin embargo, cuando vuelvo a usar la conexión para enviar un comando, siempre falla la primera vez. Entonces típicamente trabaja si envío el comando rápidamente (dentro de 5 segundos), pero falla si espero un rato. No creo que sea un problema de SSL porque se conecta la primera vez correctamente, pero podría estar equivocado aquí. También he intentado muchas variaciones diferentes, como la adición de:

 conn.setUseCaches(false); conn.setRequestProperty("Connection","Keep-Alive"); conn.getHostnameVerifier(); conn.getSSLSocketFactory(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); conn.wait(100); 

Sin embargo, no tuve suerte. Cualquier ayuda sería muy apreciada.

Pruebe System.setProperty("http.keepAlive", "false"); Antes de que lo hagas

 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 

Pruebe este código – funciona bastante confiable para mí:

 public static final String USER_AGENT = "Mozilla/5.0 (Linux; U; Android 1.1; en-us;dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2"; private DefaultHttpClient getThreadSafeHttpClient() { final HttpParams params = new BasicHttpParams(); params.setParameter("http.useragent", USER_AGENT); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); final SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); registry.register(new Scheme("https", sslSocketFactory, 443)); final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); final DefaultHttpClient httpclient = new DefaultHttpClient(manager, params); // how to handle retries final HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context) { if (executionCount >= 5) { // Do not retry if over max retry count return false; } if (exception instanceof NoHttpResponseException) { // Retry if the server dropped connection on us return true; } if (exception instanceof SSLHandshakeException) { // Do not retry on SSL handshake exception return false; } final HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); final boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { // Retry if the request is considered idempotent return true; } return false; } }; httpclient.setHttpRequestRetryHandler(myRetryHandler); return httpclient; } 

Sólo una pequeña adición a la respuesta de m6tt arriba:

 private static void disableConnectionReuseIfNecessary() { // HTTP connection reuse which was buggy pre-froyo if (!Constants.SUPPORTS_FROYO) { System.setProperty("http.keepAlive", "false"); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.