我以前使用HttpClient和BasicNameValuePairs,由于某种原因我必须转移到HttpUrlConnection.
因此这个代码,使一个HttpPost请求具有一些参数:
public class MConnections { static String BaseURL = "http://www.xxxxxxxxx.com"; static String charset = "UTF-8"; private static String result; private static StringBuilder sb; private static List<String> cookies = new ArrayList<String>(); public static String PostData(String url,String sa[][]) { HttpURLConnection connection = null; try { connection = (HttpURLConnection) new URL(BaseURL + url) .openConnection(); } catch (MalformedURLException e1) { } catch (IOException e1) { } cookies = connection.getHeaderFields().get("Set-Cookie"); try{ connection.setDoOutput(true); // Triggers POST. connection.setRequestProperty("Accept-Charset",charset); connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset); }catch (Exception e) { //Here i get Exception that "java.lang.IllegalStateException: Already connected" } OutputStream output = null; String query = ""; int n = sa.length; for (int i = 0; i < n; i++) { try { query = query + sa[i][0] + "=" + URLEncoder.encode(sa[i][1],"UTF-8"); } catch (UnsupportedEncodingException e) { } } try { output = connection.getOutputStream(); output.write(query.getBytes(charset)); } catch (Exception e) { //Here i get Exception that "android: java.net.protocolException: Does not support output" } finally { if (output != null) try { output.close(); } catch (IOException e) { } } InputStream response = null; try { response = connection.getInputStream(); } catch (IOException e) { //Here i get Exception that "java.io.IOException: BufferedInputStream is closed" } finally { //But i am closing it here connection.disconnect(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( response,"iso-8859-1"),8); sb = new StringBuilder(); sb.append(reader.readLine()); String line = "0"; while ((line = reader.readLine()) != null) { sb.append("\n" + line); } response.close(); result = sb.toString(); } catch (Exception e) { } return result; } }
但是我在代码中注释了这样的异常.
其实我正在使用AsyncTask从我的Activity中调用MConnections.PostData()两次.这可能会导致异常:已连接,但我正在使用connection.disconnect.但为什么我还会得到这个异常?
我用错了吗?
谢谢
解决方法
对于协议异常,请在调用getOutputStream()之前尝试添加以下内容:
connection.setDoOutput(true);
发现这个答案感谢Brian Roach在这里的答复:https://stackoverflow.com/a/14026377/387781
旁注:我在运行Gingerbread的HTC Thunderbolt上出现了这个问题,但不是在运行Jelly Bean的Nexus 4上.