android httpclient工作,但我的类似HttpUrlconnection没有发布

时间:2015-06-24 22:48:05

标签: java android httpurlconnection

许多人都知道新的应用程序应该使用HttpUrlconnection,因为Httpclient不能通过api 22.我在HttpClient中有以下代码成功发布到服务器然后我评论出来并交换HttpUrlconnection并且它没有发布。我的HttpUrlconnection代码可能有什么问题

    URL url = new URL(LOGIN_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.connect();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
       String cert="username=user_777&password=76566";
        conn.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(cert);
        wr.flush();
        wr.close();

      conn.disconnect();

HttpClient中的类似代码完美运行

 HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(LOGIN_URL);
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
        nameValuePair.add(new BasicNameValuePair("username", "test_user"));
        nameValuePair.add(new BasicNameValuePair("password", "123456789"));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        HttpResponse response = httpClient.execute(httpPost);
        Log.d("Http Post Response:", response.toString());

Httpclient有效,HttpUrlclient不能如何使其工作?它们都有相同的URL。

1 个答案:

答案 0 :(得分:1)

问题是,当连接已经打开时,您正在调用conn.setDoOutput(true)

来自the documentation

  

设置指示此URLConnection是否允许输出的标志。它   建立连接后无法设置。

将呼叫转移至conn.setDoOutput(true);conn.connect();之前解决问题。

以下是我使用原始代码时出现的错误:

 java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.IllegalStateException: Already connected
            at java.net.URLConnection.checkNotConnected(URLConnection.java:464)
            at java.net.URLConnection.setDoOutput(URLConnection.java:878)

这是完全正常工作和测试的代码,注意我添加了一些try / catch块并稍微移动了一些东西,还添加了代码来从服务器读取结果:

class MyAsyncTask extends AsyncTask<String, String, String> {

    String LOGIN_URL = "http://www.example.com/someFile.php";
    HttpURLConnection conn;
    DataOutputStream wr;
    StringBuilder result = new StringBuilder();
    URL url;

    @Override
    protected String doInBackground(String... params) {

        try {
            url = new URL(LOGIN_URL);

            conn = (HttpURLConnection) url.openConnection();

            conn.setDoOutput(true); //moved here

            conn.connect();

        } catch (IOException e) {
            e.printStackTrace();
        }

        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        try {
            conn.setRequestMethod("POST");
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
        String cert="name=user_777&message=7656666666";


        try {
            wr = new DataOutputStream(conn.getOutputStream());
            wr.writeBytes(cert);
            wr.flush();
            wr.close();

            InputStream in = new BufferedInputStream(conn.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }


        conn.disconnect();

        return result.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG ).show();
    }
}