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) …
- ¿Por qué getHandler () devuelve null?
- Completion Handlers en Android
- Timertask o manejador
- ¿Por qué usar HandlerThread en Android?
- Android - Menú Opciones no funcionará
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; } } }
- Error de Eclipse dando "excepción de bucle de evento no controlado" No más identificadores
- Cómo devolver un resultado a través de múltiples actividades
- Cómo hacer tostadas de otro hilo (sans runOnUiThread)
- Asegúrese de que mi código es seguro para hilos
- Java.lang.RuntimeException: Handler (android.os.Handler) envío de mensajes a un Handler en un hilo muerto
- ¿Cómo utilizar los controladores?
- Android: Múltiples temporizadores en un ListView con manejador y ejecutables. 2 Problemas
- Actualización de la interfaz de usuario con Runnable y postDelayed no funciona con la aplicación de temporizador
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
- OnSaveInstanceState no funciona
- ¿Hay alguna API de Google Now en la que podamos integrar nuestras propias aplicaciones en ahora?