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?
et j'appelle cette classe à Oncreate () P> new Background_confirmation().execute();
3 Réponses :
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 code>, car
onpexecute code> a lieu sur le fil principal. Ainsi, une exception s'est produite. Les détails sont ici . P>
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é»?
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);
}
}
}
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.
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 code>. Pour vérifier les performances au moment de l'exécution, vous pouvez utiliser une certaine mesure tas b>, Tracker d'allocation B> Like Vues dans DDMS B> Mode dans votre éclipse.
Consultez la requête Android pour ces tâches asynchronisées, simplifie tout.