Java android httpclient可以工作,但我类似的HttpUrlconnection无法发布

Java android httpclient可以工作,但我类似的HttpUrlconnection无法发布,java,android,httpurlconnection,Java,Android,Httpurlconnection,正如你们中的许多人所知,新的应用程序应该使用HttpUrlconnection,因为Httpclient在api 22之后将无法工作。我在HttpClient中有下面的代码,它成功地发布到服务器,然后我在HttpUrlconnection中注释掉并交换,但它没有发布。我的HttpUrlconnection代码可能有什么问题 URL url = new URL(LOGIN_URL); HttpURLConnection conn = (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-HttpClient=newdefaulthttpclient();
HttpPost HttpPost=新的HttpPost(登录地址);
List nameValuePair=新的ArrayList(2);
添加(新的BasicNameValuePair(“用户名”、“测试用户”);
添加(新的BasicNameValuePair(“密码”,“123456789”);
setEntity(新的UrlEncodedFormEntity(nameValuePair));
HttpResponse response=httpClient.execute(httpPost);
Log.d(“Http Post响应:,Response.toString());

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

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

发件人:

设置指示此URLConnection是否允许输出的标志。信息技术 无法在建立连接后设置

将调用移动到
conn.setDoOutput(true)到连接()之前的
连接()修复了该问题

以下是我在使用您的原始代码时遇到的错误:

 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();
    }
}
类MyAsyncTask扩展了AsyncTask{ 字符串登录\u URL=”http://www.example.com/someFile.php"; httpurl连接连接; 数据输出流; StringBuilder结果=新建StringBuilder(); 网址; @凌驾 受保护的字符串doInBackground(字符串…参数){ 试一试{ url=新url(登录\ url); conn=(HttpURLConnection)url.openConnection(); conn.setDoOutput(true);//搬到这里 连接(); }捕获(IOE异常){ e、 printStackTrace(); } 连接设置读取超时(10000); 连接设置连接超时(15000); 试一试{ conn.setRequestMethod(“POST”); }捕获(协议例外e){ e、 printStackTrace(); } String cert=“name=user_777&message=76566666”; 试一试{ wr=新的DataOutputStream(conn.getOutputStream()); wr.writeBytes(证书); wr.flush(); wr.close(); InputStream in=新的BufferedInputStream(conn.getInputStream()); BufferedReader reader=新的BufferedReader(新的InputStreamReader(in)); 弦线; 而((line=reader.readLine())!=null){ 结果。追加(行); } }捕获(IOE异常){ e、 printStackTrace(); } 连接断开(); 返回result.toString(); } @凌驾 受保护的void onPostExecute(字符串结果){ Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show(); } }
非常感谢,我很欣赏这个深入的示例,现在我的代码运行得非常好。我还将阅读文档。