Corregir el contexto para usar en las devoluciones de llamada

El título lo dice todo. Si tiene una devolución de llamada de una clase a otra y necesita llamar a algún método desde dentro de la devolución de llamada que requiere un contexto, ¿cuál es el contexto correcto para usar? Un ejemplo común sería un AsyncTask con una devolución de llamada a la Activity o Fragment que lo utilizó.

En general, intento evitar utilizar getApplicationContext() pero no puedo usar this como el contexto de una devolución de llamada. ¿Es este un caso en el que el uso de un contexto más amplio es apropiado?

Para aclarar más, estoy pensando en una devolución de llamada con una interfaz entre un AsyncTask y una actividad. Una vez que estoy dentro del método de interfaz sobreescrito no puedo obtener el contexto de las actividades desde allí.

2 Solutions collect form web for “Corregir el contexto para usar en las devoluciones de llamada”

Utilice el contexto de la actividad. Ejemplo:

 MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

 public MyAsyncTask(MyActivity context) { mContext = context; } 

Para llamar al método methodToCall() de MyAsyncTask desde dentro de MyAsyncTask :

 ((MyActivity)mContext).methodToCall(); 

Editar 1:

Supongo que su problema es este:

 public class MyActivity extends Activity { Button b; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.some_layout); b = (Button) findViewById(...); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Button newButton = new Button(this); // Won't work!! } }); } } 

Solución:

  • Declare un método en MyActivity: getContext()

     public Context getContext() { return (Context)this; } b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Button newButton = new Button(getContext()); // Will work } }); 
  • Use MyActivity.this en lugar de this .

  • Otra forma es afirmar que MyActivity implementa la interfaz:

     public class MyActivity extends Activity implements View.OnClickListener { .... .... @Override public void onClick(View v) { Button newButton = Button (this) // Will Work } } 

Es un tema aber "fugas". En primer lugar, la Actividad que hay que pasar no es buena. De acuerdo con algunas otras sugerencias de que la gente debe usar getApplication o getApplicationContext. Pero puede utilizar WeakReference para su envoltorio, es decir:

 static class X { WeakReference<Activity> context; X(Activity context) { this.context = new WeakReference<Activity>(context); } } 

Recuerde el uso estático para marcar su clase, podría evitar potencial "esto" a su anfitrión Actividad.

Podría haber dado algunas sugerencias, no podría nada 🙂

  • Valor devuelto del método onPostExecute de la clase AsyncTask
  • Aplicación de Android: mostrar elementos de superposición en AsyncTask
  • Llamada AsyncTask desde receptor de difusión Android
  • Android AsyncTask no se llama para minutos en ICS
  • Cómo manejar los cambios de orientación de la pantalla cuando hay una asyntax ejecutando con android 4.x
  • Android Async, Handler o temporizador?
  • Bloquear la orientación hasta que termine Asíntate
  • Android detecta doble toque sin un solo toque primero
  • Android: Cámara Asynctask con devolución de llamada de vista previa
  • Cómo asegurarse de que los datos se guardarán antes de que android mata un proceso
  • ¿Por qué estoy recibiendo android.os.NetworkOnMainThreadException con AsyncTask?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.