我有这个方法:
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
我该怎么办?
答案 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();