android.os.NetworkOnMainThreadException при публикации данных в URL

В приведенном ниже коде я получаю сообщение об ошибке при запуске моего проекта Android

Код:

  try {                 
        Gson gson = new Gson();
        String json = gson.toJson(stockDetailData);
        String json1 = gson.toJson(stockMainData); 
        String json2 = gson.toJson(pledgerData);
        JSONObject jo = new JSONObject();                   

        jo.put("stockDetailData", json.toString());
        jo.put("stockMainData", json1.toString());
        jo.put("pledgerData", json2.toString());
        jo.put("company_id", "4");



        URL url = new URL("http://127.0.0.1:180/AfaqTraders/index.php/sale/saveVoucher");

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url.toURI());

        // Prepare JSON to send by setting the entity
        httpPost.setEntity(new StringEntity(jo.toString(), "UTF-8"));

        // Set up the header types needed to properly transfer JSON
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setHeader("Accept-Encoding", "application/json");
        httpPost.setHeader("Accept-Language", "en-US");

        // Execute POST
        HttpResponse response = httpClient.execute(httpPost);                   
    } catch(Exception e) {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

Ошибка: android.os.NetworkOnMainThreadException

Я искал ошибку, но не могу ее найти. Кто-нибудь может сказать мне, что я здесь делаю неправильно?

4 ответа

Решение

Это потому, что вы делаете сетевую операцию на Main UI thread

если вы используете потоки для сетевых операций, вы можете использовать этот фрагмент кода

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

в вашем OnCreate()

Но неправильно использовать вышеуказанную операцию, вместо этого следует использовать AsyncTask класс, предоставляемый Android для правильной работы сети without blocking UI thread,

Вы можете узнать больше, посетив эту ссылку

или можете использовать приведенный ниже код

private class UploadFiles extends AsyncTask<String, Void, Void> {
     protected String doInBackground(String... urls) {
         //THIS METHOD WILL BE CALLED AFTER ONPREEXECUTE
         //YOUR NETWORK OPERATION HERE
         return null;
     }

     protected void onPreExecute() {
         super.onPreExecute();
         //THIS METHOD WILL BE CALLED FIRST
         //DO OPERATION LIKE SHOWING PROGRESS DIALOG PRIOR TO BEGIN NETWORK OPERATION
     }

     protected void onPostExecute(String result) {
         super.onPostExecute();
         //TNIS METHOD WILL BE CALLED AT LAST AFTER DOINBACKGROUND
         //DO OPERATION LIKE UPDATING UI HERE
     }
 }

и вы можете просто позвонить в этот класс, написав

 new UploadFiles ().execute(new String[]{//YOUR LINK});

Вы должны подключиться к сети, используя Asynctask, потоки, обработчик, а не основной поток. Если вы попытаетесь подключиться (выполнить длительные операции), используя основной UIThread, вы увидите эту ошибку.

you should use asynctask [asynctask][1]


  [1]: http://developer.android.com/reference/android/os/AsyncTask.html

> class async extends AsyncTask<Params, Progress, Result>
    //Params used in the asynctask
    //Progress for progress bar
    //Result here the result of parsing
    {@Override

    protected void onPreExecute() {
//before parsing you can launch a progress bar

        super.onPreExecute();
    }

    @Override
        protected void onPostExecute(Void result) {

        //processing after parsing



        super.onPostExecute(result);
        }

        @Override
        protected Void doInBackground(Void... params) {
// parsing here
            return null;
        }}

Это исключение выдается, когда приложение пытается выполнить сетевую операцию в своем основном потоке. Запустите ваш код в AsyncTask или IntentService w

см. этот пример, чтобы узнать, как обрабатывать сетевые операции в asyncTask

Другие вопросы по тегам