10
votes

Pourquoi je reçois Android.os.NetworkonMainThreadException avec asyncctage?

Je reçois Android.os.NetworkonmaintHreadException pendant que j'ai écrit le code de fonctionnement de la mise en réseau à Asynktask. Y a-t-il une autre raison de lancer cette exception?

Voici mon code: strong> p> xxx pré>

et j'appelle cette classe à Oncreate () P>

new Background_confirmation().execute();


1 commentaires

Consultez la requête Android pour ces tâches asynchronisées, simplifie tout.


3 Réponses :


5
votes

Vous avez utilisé une méthode fausse d'asynctacterie pour placer votre code associé au réseau. S'il vous plaît, déplacez-le sur doInfbackground , car onpexecute a lieu sur le fil principal. Ainsi, une exception s'est produite. Les détails sont ici .


2 commentaires

Merci pour la réponse, mais si je mets le code dans DoIndbackground (), je ne reçois pas le résultat souhaité


Qu'entendez-vous par «résultat souhaité»?



3
votes

mettre tout votre code de demande de réseau dans doIndbackground code>. Onpreexecute Code> et Onpostexecute Code> sera exécuté sur le fil d'interface utilisateur (THEAD MAIN) afin d'obtenir une exception si vous demandez au réseau sur ces 2 méthodes.

public class Background_confirmation extends AsyncTask<Void, Integer, Void> {
    @Override
    protected void onPreExecute() {            
        progressDialog = ProgressDialog.show(Confirmation.this,
                "Please wait...", "Retrieving data ...", true);            

    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        try {
            HttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(
                    "http://68.121.167.160/sip_chat_api/create_account.php?useralias="
                            + useralias + "&cntname=" + cntcode + "");
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
                is = entity.getContent();


        } catch (Exception e) {
            e.printStackTrace();
        }
        if (backgroung_flag == 1) {

        } else {
            if (is != null) {
                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is, "UTF-8"));
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();

                    result = sb.toString();
                } catch (Exception e) {
                    Log.e("log_tag",
                            "Error converting result " + e.toString());
                }
            }

        }
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
            // progressDialog.setCancelable(true);
        }

    }

}


0 commentaires

4
votes
public class Background_confirmation extends AsyncTask<Void, Integer, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            progressDialog = ProgressDialog.show(Confirmation.this, "Please wait...", "Retrieving data ...", true);

        }

        @Override
        protected String doInBackground(Void... params) {

            try {
                HttpClient httpclient = new DefaultHttpClient();

                HttpPost httppost = new HttpPost("http://68.121.167.160/sip_chat_api/create_account.php?useralias=" + useralias + "&cntname=" + cntcode + "");
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

            } catch (Exception e) {
                e.printStackTrace();
            }
            if (backgroung_flag == 1) {

            } else {
                if (is != null) {
                    try {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        is.close();

                        result = sb.toString();
                    } catch (Exception e) {
                        Log.e("log_tag", "Error converting result " + e.toString());
                    }
                }
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                // progressDialog.setCancelable(true);
            }
        }
    }
Your code should change like above. Things you have to consider
Connectivity should code inside doInBackground()
If you want to get the result of the doInBackground(), you have to take it in onPostExecute()
That means you have to return a String value in doInBackground() where your third parameter of AsyncTask class should be String too (which is not in Wayne's answer)
In your code, you are calling a InputStream that we cannot see except in the "else" part. If you are using only that InputStream, make sure code always reach the else part. 

2 commentaires

Merci cela a fonctionné génial! Si j'utilise le code de Dipak Keshariya pour désactiver la stratégie Stricmode, alors ralentira-t-il les performances de ma candidature? Parce que lors de la désactivation de StrictMode, il montre beaucoup de lignes dans Log.What est votre opinion>


C'est normal de montrer beaucoup de codage tout en utilisant strictmode . Pour vérifier les performances au moment de l'exécution, vous pouvez utiliser une certaine mesure tas , Tracker d'allocation Like Vues dans DDMS Mode dans votre éclipse.