Problèmes avec le contexte lorsque vous essayez d'afficher Toast
-
02-10-2019 - |
Question
J'essaie d'afficher un toast dans un AsyncTask.
Ce premier morceau de code est placé dans une activité que l'on peut appeler MyActivity
, et fonctionne très bien:
Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show();
Puis-je créer une nouvelle instance de MyObject
et appels method()
. Ce code est également placé dans MyActivity
.
MyObject obj = new MyObject(this);
obj.method();
Ceci est la définition de MyObject
. Le ProgressDialog fonctionne très bien, mais pas de pain grillé est montré.
public class MyObject {
Context cxt;
public MyObject(Context cxt) {
this.cxt = cxt;
}
public void method() {
new MyAsyncTask().execute();
}
private class MyAsyncTask extends AsyncTask<Object, Integer, Boolean> {
protected void onPreExecute() {
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // works fine
}
protected Boolean doInBackground(Object... params) {
Looper.prepare();
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // doesn't work
}
}
}
Je croyais que je faisais exactement la même chose dans mon premier exemple et au-dessous, mais appearently, je manque quelque chose. J'ai aussi essayé getApplicationContext()
et cxt.getApplicationContext()
au lieu de cxt
, mais avec le même résultat.
La solution
WRAP dans la méthode runOnUIThread
:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show();
}
});
En effet, la méthode de doInBackground
n'a pas été exécuté sur l'interface utilisateur de cette discussion, vous devez forcer cela.
Autres conseils
Vous devez utiliser
MyObject.this
à l'intérieur de la AsyncTask