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í.

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 🙂

  • Android: ¿Cómo puedo acceder a un AsyncTask desde un PendingIntent creado por una notificación de barra de estado?
  • Android AsyncTask no se llama para minutos en ICS
  • No se puede transferir datos de la aplicación a mysql usando localhost
  • ¿Cómo expirar Asynctask y descartar ProgressDialog?
  • Interacción con AsyncTask de la barra de notificación
  • La cámara no reemplaza la imagen antigua si cambia la orientación
  • Está utilizando la biblioteca de eventos como Otto o EventBus como una forma recomendada de manejar las relaciones entre Actividades, Fragmentos y subprocesos de fondo
  • Android.os.NetworkOnMainThreadException dentro de AsyncTask
  • Intenta invocar el método virtual 'void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)' en una referencia de objeto nulo
  • Webview con asynctask en Android
  • ¿cuál es el mejor enfoque para escanear filesytem para archivos mp3 en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.