86 votes

obtention du contexte dans AsyncTask

J'essaie de récupérer le contexte dans mon AsyncTask de la classe appelée Opciones (cette classe est la seule qui appelle cette tâche) mais je ne sais pas comment faire, j'ai vu un code comme celui-ci :

      protected void onPostExecute(Long result) {

    Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}

Mais ça ne marche pas pour moi, c'est écrit : "No enclosing instance of the type Opciones in scope"

181voto

Chintan Rathod Points 7938

Vous devez faire les choses suivantes.

  • lorsque vous voulez utiliser AsyncTask et l'étendre à d'autres classes. MyCustomTask .
  • dans le constructeur de la nouvelle classe, passez Contexte

Exemple

public class MyCustomTask extends AsyncTask<Void, Void, Long> {

    private Context mContext;

    public MyCustomTask (Context context){
         mContext = context;
    }

    //other methods like onPreExecute etc.
    protected void onPostExecute(Long result) {
         Toast.makeText(mContext,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
    }
}

Et instanciez la classe en suivant.

MyCustomTask task = new MyCustomTask(context);
task.execute(..);

62voto

Sai Kiran Points 342

En conservant une référence faible à l'activité hôte, on évite les fuites de mémoire.

static class MyTask extends AsyncTask<Void, Void, Void> {
    // Weak references will still allow the Activity to be garbage-collected
    private final WeakReference<Activity> weakActivity;

    MyTask(Activity myActivity) {
      this.weakActivity = new WeakReference<>(myActivity);
    }

    @Override
    public Void doInBackground(Void... params) {
      // do async stuff here
    }

    @Override
    public void onPostExecute(Void result) {
      // Re-acquire a strong reference to the activity, and verify
      // that it still exists and is active.
      Activity activity = weakActivity.get();
      if (activity == null
          || activity.isFinishing()
          || activity.isDestroyed()) {
        // activity is no longer valid, don't do anything!
        return;
      }

      // The activity is still valid, do main-thread stuff here
    }
  }

13voto

codeMagic Points 27151

Puisqu'un seul Activity utilise cette tâche, il suffit d'en faire une classe interne de cette classe. Activity

public class Opciones extends Activity
{
     public void onCreate()
     {
         ...
     }

    public class MyTask extends AsyncTask<>
    {
        ...

         protected void onPostExecute(Long result) {
        Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
     }
}

Vous avez alors accès aux variables membres de la Activity et son Context

-7voto

yahya.can Points 1720

Vous pouvez écrire getApplicationContex() . Ou Définir une variable globale.

Activity activity;

Et au onCreate() fonction

activity = this;

alors,

 protected void onPostExecute(Long result) {

    Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X