obtenir un contexte dans AsyncTask

J’essaie d’obtenir le contexte dans ma AsyncTask de la classe appelée Opciones (cette classe est la seule qui appelle cette tâche) mais je ne sais pas comment le faire, j’ai vu du code comme ceci:

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

Mais cela ne fonctionne pas pour moi, il dit: "No enclosing instance of the type Opciones in scope"

Vous devez faire les choses suivantes.

  • lorsque vous souhaitez utiliser AsyncTask , étendez -le dans une autre classe, par exemple MyCustomTask .
  • en constructeur de nouvelle classe, passer Context

Exemple

 public class MyCustomTask extends AsyncTask { 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(..); 

Une faible référence à l’activité hôte empêchera les memory leaks.

 static class MyTask extends AsyncTask { // Weak references will still allow the Activity to be garbage-collected private final WeakReference 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 } } 

Puisqu’une seule Activity utilise cette tâche, il suffit d’en faire une classe interne de 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 access aux variables membres de l’ Activity et de son Context

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

 Activity activity; 

Et à la fonction onCreate()

 activity = this; 

puis,

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