Estoy tratando de obtener el contexto en mi AsyncTask de la clase llamada Opciones (esta clase es la única que llama a esa tarea) pero no sé cómo hacerlo, vi un código como este:
protected void onPostExecute(Long result) {
Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Pero no me funciona, dice: "No enclosing instance of the type Opciones in scope"
AsyncTask
Respuestas:
Necesitas hacer las siguientes cosas.
Ejemplo
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(); } }
E instancia la clase siguiendo.
MyCustomTask task = new MyCustomTask(context); task.execute(..);
fuente
Mantener una referencia débil a la actividad del host evitará pérdidas de memoria.
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 } }
fuente
Dado que solo uno
Activity
usa esta tarea, conviértalo en una clase interna de eseActivity
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(); } }
Entonces tienes acceso a las variables miembro de
Activity
y suContext
fuente
AsyncTask
para operaciones de corta duración y, a menudo, para actualizar vistas en un archivoActivity
. A menudo, es una buena idea cancelarlosonPause()
si aún se están ejecutando. Quizás me equivoque, pero esos siempre han sido mis pensamientos al respecto. Aquí hay más lecturas sobre el tema .Puedes escribir
getApplicationContex()
. O Definir variable global.Y en la
onCreate()
funciónactivity = this;
entonces,
protected void onPostExecute(Long result) { Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); }
fuente