Android: Llamar a métodos no estáticos desde una clase de controlador estático

Dado este código:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { public static final int MESSAGE_NOT_CONNECTED = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); } // ------------------------------------------------- public final void setStatus(int Rid) { final ActionBar actionBar = getActionBar(); actionBar.setSubtitle(Rid); } // ------------------------------------------------- static Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_NOT_CONNECTED: setStatus(R.string.title_not_connected); break; } } } } 

Estoy recibiendo el error de compilación: No se puede hacer una referencia estática al método no estático setStatus (int) …

Lo que tiene sentido, porque getActionBar () en setStatus () es un método no estático.

Hice la clase del manejador estática debido a la advertencia: Esta clase del manipulador debe ser estática o los escapes pueden ocurrir.

La pregunta: ¿cómo acceder correctamente al método setStatus () desde el controlador estático?

EDIT: el nuevo código del manejador es la respuesta.

 static class hHandler extends Handler { private final WeakReference<MainActivity> mTarget; hHandler(MainActivity target) { mTarget = new WeakReference<MainActivity>(target); } @Override public void handleMessage(Message msg) { MainActivity target = mTarget.get(); If(target == null) { return; } switch (msg.what) { case MESSAGE_NOT_CONNECTED: target.setStatus(R.string.title_not_connected); break; } } } 

Intente usar una WeakReference , como se describe en este artículo .

Puesto que ahora está utilizando una WeakReference , mTarget.get() puede devolver null . En el código editado, no está comprobando si el target es null antes de ejecutar target.setStatus(R.string.title_not_connected) . Por lo tanto, esto puede arrojar una excepción NullPointerException si el objeto weakreference ha sido GC'ed.

En el método onDestroy de mi actividad llamo:

 this.myHandler.removeCallbacksAndMessages(null); 

Esto no se deshace de la advertencia "Esta clase de controlador debe ser estática o se pueden producir fugas", pero creo que destruye el mensaje por lo tanto detener la fuga. Mi clase handler es una clase interna no estática de mi actividad. Mi actividad tiene una instancia de MyHandler myHandler.

Cuando hago esto, no se llama el método handleMessage del manejador, lo que supongo significa que el mensaje que contiene el controlador, que contenía una referencia a la actividad, fue destruido. Estoy abierto para comentarios ya que no lo he probado con cualquier herramienta de prueba de fugas. Aquí es donde he copiado la idea: http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html contestador: CyrilJanuary 15, 2013 at 7:50 AM

  • Despido de ProgressDialog en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.