在Android中发送发布请求时出错

时间:2014-12-24 14:21:08

标签: java android http

我有这个方法:

public String post(String urlParameters, String url) throws IOException{
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "Chrome");
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();
        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + urlParameters);
        System.out.println("Response Code : " + responseCode);
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        return response.toString();
    }

它编译得很好,但它不会运行。取消清单,互联网许可存在。 它说(在logcat中)

12-24 14:59:31.028 E/AndroidRuntime(30941): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fliife.bitvisitorbot/com.fliife.bitvisitorbot.MainActivity}: android.os.NetworkOnMainThreadException

我该怎么办?

4 个答案:

答案 0 :(得分:0)

当应用程序尝试在其主线程上执行网络操作时抛出此异常,因为网络操作可能涉及不可预测的延迟。为防止此操作导致糟糕的用户体验,请始终在UI的单独线程上执行网络操作。 AsyncTask类提供了从UI线程启动新任务的最简单方法之一。

请参阅:AsyncTask

仅为了您的信息,仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。

答案 1 :(得分:0)

在另一个线程中进行网络操作。在android中你不能在ui线程上执行网络操作 请参阅此示例程序http://www.androidhive.info/2011/10/android-making-http-requests/

答案 2 :(得分:0)

您无法在主线程上发布请求,这意味着您应该发送请求async。您可以使用AsyncTask使请求执行异步,本文供您参考:https://developer.android.com/training/basics/network-ops/connecting.html

答案 3 :(得分:0)

您需要一个AsyncTask

public class Start extends AsyncTask<String, Integer, String>{

    protected void onPreExecute() {
        dialog = new ProgressDialog(MainActivity.this); //your activity
        dialog.setTitle("Downloading data in progress");
        dialog.setMessage("Wait few seconds...");
        dialog.show();
    }

    protected String doInBackground(String... urls){

        // inside this method you must call your post() method
    }

    protected void onPostExecute(final String result) {

          dialog.dismiss();
       // inside this one you can update your items

    }
}

并称之为:

new Start().execute();