with maketext android android-asynctask toast android-context

maketext - toast properties android



Obtención de contexto en AsyncTask (4)

Estoy intentando obtener el contexto en mi AsyncTask de la clase llamada Opciones (esta clase es la única que llama 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 funciona para mí, dice: "No enclosing instance of the type Opciones in scope"


Mantener una referencia débil a la actividad del host evitará las fugas 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 } }


Puedes escribir getApplicationContex() . O definir variable global.

Activity activity;

Y en la función onCreate()

activity = this;

entonces,

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


Tienes que hacer lo siguiente.

  • cuando quiera usar AsyncTask , extiéndalo en otra clase, por ejemplo MyCustomTask .
  • En constructor de nueva clase, pase contexto.

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(); } }

Y ejemplifica la clase siguiendo.

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


Ya que solo una Activity usa esta tarea, entonces hágala una clase interna de esa 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(); } }

Luego tienes acceso a las variables miembro de la Activity y su Context