Problème avec le pain grillé AsyncTask appel de la méthode
Hey Tout Le Monde,
J'ai une AsyncTask que les posts de certaines des données à un serveur. Il le fait par l'appel d'une méthode statique que j'ai écrit à partir de doInBackground. Quand je lance l'AsyncTask, j'envoie le contexte de l'activité qui a appelé execute(), que j'envoie à ma méthode statique, car il a besoin d'elle pour faire un Toast si quelque chose va mal, tout en parlant au serveur. Cependant, j'ai cette erreur lors d'un Toast est fait dans la méthode statique:
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): FATAL EXCEPTION: AsyncTask #1
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): java.lang.RuntimeException: An error occured while executing doInBackground()
04-21 12:49:16.689: ERROR/AndroidRuntime(2123):at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.lang.Thread.run(Thread.java:1019)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.Handler.<init>(Handler.java:121)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.<init>(Toast.java:68)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.makeText(Toast.java:23
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.util.ServerConnections.PostToLoginPage(ServerConnections.java:36)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:150)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:1)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): ... 4 more
Qui est suivie par une fuite de la fenêtre d'erreur. Je suis en supposant que c'est en raison d'une erreur avec le contexte passé pour le Toast dans la méthode statique. L'AsyncTask est:
private class LoginTask extends AsyncTask<Void, Void, Void> {
private WhiteboardLogin activity;
private Context callingContext;
private ProgressDialog dialog;
private String user, pass;
private boolean sendIntent = true, loginError = false, populateError = false;
public LoginTask(WhiteboardLogin activity, String user, String pass, Context callingContext){
this.activity = activity;
this.user = user.trim();
this.pass = pass.trim();
this.callingContext = callingContext;
}
@Override
protected Void doInBackground(Void... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("user",user));
nameValuePairs.add(new BasicNameValuePair("pass",pass));
sessionUser = user;
sessionPassword = pass;
//Posts the username and password to the login page and toasts an error if the login doesn't work
if(ServerConnections.PostToLoginPage(callingContext, nameValuePairs, activity.getString(R.string.loginPageURI)) == 1){
dialog.dismiss();
sendIntent = false;
loginError = true;
publishProgress();
return null;
}
else{
userDataList = populateUserDataList(callingContext, user,pass);
if(userDataList == null){
dialog.dismiss();
sendIntent = false;
populateError = true;
return null;
}
}
return null;
}
OriginalL'auteur Eliezer | 2011-04-21
Vous devez vous connecter pour publier un commentaire.
Le code dans le doInBackground() la méthode fonctionne sur son propre thread de sorte que vous ne peut pas accéder à tout élément de l'INTERFACE utilisateur à partir de là, dès qu'elles sont en cours d'exécution sur le thread d'INTERFACE utilisateur.
Si vous avez deux options.
Vous gérer tous les éléments d'INTERFACE utilisateur dans le onPreExecute() et onPostExecute() méthode qui courent sur le thread d'INTERFACE utilisateur.
Vous manipulez des éléments d'INTERFACE utilisateur dans le onProgressUpdate() méthode qui fonctionne également sur le thread de l'INTERFACE utilisateur. Vous pouvez également déclencher cette méthode à partir de doInBackground() en appelant publishProgress().
Oui, même alors.
OriginalL'auteur Flo
vous pouvez porter un Toast à l'intérieur de doInBackground
utiliser ce code
OriginalL'auteur Jack K Fouani
Vous essayez de mettre à jour l'INTERFACE utilisateur à l'intérieur de
doInBackground()
qui s'exécute dans un autre thread différent du thread d'INTERFACE utilisateur.Vous devez afficher le Toast dans la
onPostExecute()
méthode sur votre AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Suite)onPostExecute()
, mais ceux qui sont à l'origine des problèmes sont dans une méthode dans une classe différente de la est appelée alors que dansdoInBackground()
donc je ne suis pas en mesure de mettre enonPostExecute()
Je pense que vous devez travailler votre logique, que la méthode statique ne doit pas afficher un Toast. De toute façon, vous pouvez faire ce que vous voulez l'aide d'un Gestionnaire, au lieu de le contexte, la création d'un gestionnaire dans votre Activité, puis de le transmettre à la méthode statique. Lorsque nécessaire, de poster un exécutable qui affiche le Toast pour le gestionnaire
En fait j'ai été en utilisant uniquement le Toast pour le débogage (devrait probablement utiliser Log), j'ai pensé qu'il serait mieux pour moi de savoir si de faire quelque chose comme cela était possible.
Ah ok, oui, il est plus sûr d'utiliser le Journal à des fins de débogage 🙂
OriginalL'auteur aromero
Ouais à l'aide d'un journal de débogage est le plus simple, si toutefois vous avez des messages qui doivent être affichés pendant le traitement en arrière-plan pour quelque raison que ce soit, vous pouvez utiliser le
onProgressUpdate() la méthode, comme indiqué ci-dessus par Flo. Vous pouvez également déclencher cette méthode à chaque fois que vous avez besoin d'écrire un message, en appelant publishProgress() dans DoInBackground(). Le contenu du Message ou de statuts de traitement peut être facilement transmise via les variables privées de l'ASyncTask qui sont accessibles à la fois l'arrière-plan de la méthode et les méthodes de l'INTERFACE utilisateur.
OriginalL'auteur Jesse Finnerty