Teniendo en cuenta este código:Android: llamar a los métodos no estáticos de una clase Handler estática
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;
}
}
}
}
que estoy recibiendo el error de compilación: No se puede hacer una referencia estática al método no estático setStatus (int) ..
Lo cual tiene sentido, porque getActionBar() en setStatus() es un método no estático.
Hice la clase Handler estática debido a la advertencia: Esta clase de Handler debe ser estática o pueden producirse fugas.
La pregunta: ¿cómo accedo correctamente al método setStatus() desde el controlador estático?
EDITAR: el nuevo código de controlador 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;
}
}
}
http://stackoverflow.com/q/11407943/844882 –
El enlace que @Alex Lockwood proporcionó, conduce a otro enlace de Romain Guy que me ayudó a entender WeakReferences: clases internas estáticas vs no estáticas [enlace] (https://groups.google.com/forum/?fromgroups#!msg/android-developers/1aPZXZG6kWk/lIYDavGYn5UJ). Puedo responder mi propia pregunta, pero aún no puedo publicarla. – vedavis
He respondido la pregunta (ya que aparentemente no puede publicarla aún ...): P –