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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top