2014-12-24 4 views
1

У меня есть этот метод:Ошибки при отправке запроса записи в Android

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(); 
    } 

Он компилирует нормально, но это не будет работать. Un манифест, есть разрешение на доступ в Интернет. Он говорит (в 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

Это исключение возникает, когда приложение пытается выполнить сетевую операцию в своем основном потоке, потому что операции в сети могут включать непредсказуемые задержки. Чтобы это не вызвало плохой пользовательский интерфейс, всегда выполняйте сетевые операции в отдельном потоке из пользовательского интерфейса. Класс AsyncTask предоставляет один из простейших способов запуска новой задачи из потока пользовательского интерфейса.

См: AsyncTask:

Просто для информации, это только брошено для приложений, ориентированных на Honeycomb SDK или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено создавать сети по своим основным потокам цикла событий, но это сильно обескураживает.

0

Вы не можете оставить запрос на главном потоке, это означает, что вы должны разместить свой запрос async.you можно использовать AsyncTask, чтобы сделать Ваш запрос выполнить асинхра , эта статья для справки: https://developer.android.com/training/basics/network-ops/connecting.html

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(); 
Смежные вопросы