GetHttpResponseCode () возвращает -1 в android 2.2

В моем приложении Android я пытаюсь извлечь данные с сервера, выполнив запрос POST.

Я использую класс HttpURLConnection чтобы сделать запросы, поскольку HttpClient от Apache больше не поддерживается андроидом.

Вот что я делаю.

 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; } 

Это отлично работает на каждом устройстве, кроме устройств, работающих под управлением 2.2 (не пробовал в 2.1).

В 2.2 он работает нормально. Но если я оставлю эту часть кода бездействующей в течение более 30 секунд, она возвращает меня с -1 в качестве кода ответа HTTP в следующий раз.

Другое дело, что это происходит только с URL-адресами HTTPS, а не с HTTP-адресами. Я не хочу использовать класс HttpsURLConnection, потому что иногда я могу использовать и HTTP.

Я не закрываю соединение, чтобы поддерживать связь. Что я делаю не так?

Solutions Collecting From Web of "GetHttpResponseCode () возвращает -1 в android 2.2"

Если вы хотите одновременно использовать Https и Http и не хотите создавать отдельное соединение, и если HttpsUrlConnection решает вашу проблему «-1», вы можете использовать следующий подход:

 URLConnection conn = new URL(url).openConnection(); if (conn instanceof HttpsURLConnection) { // do stuff with cast to HttpsUrlConection } else { // do stuff with cast to HttpUrlConnection } 

Я принял этот ответ как ссылку