web-dev-qa-db-fra.com

obtenir un contexte dans AsyncTask

J'essaie d'obtenir le contexte dans ma tâche Async de la classe appelée Opciones (cette classe est la seule à appeler cette tâche), mais je ne sais pas comment faire. J'ai vu du 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, ça dit: "No enclosing instance of the type Opciones in scope"

77
D4rWiNS

Vous devez faire les choses suivantes.

  • lorsque vous voulez utiliser AsyncTask, étendez-le dans une autre classe, dites MyCustomTask.
  • dans le constructeur de la nouvelle classe, passez Context

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 instancier la classe en suivant.

MyCustomTask task = new MyCustomTask(context);
task.execute(..);
166
Chintan Rathod

Le fait de garder une référence faible à l’activité hôte é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
    }
  }
46
Sai Kiran

Comme un seul Activity utilise cette tâche, il suffit d’en faire une classe interne à cette 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(); 
     }
}

Ensuite, vous avez accès aux variables membres du Activity et de son Context

13
codeMagic