Observable / Observador no funciona?

Intenté implementar una observable estática en mi subclase de aplicación, pero no funciona. No hay excepciones o mensajes de error, pero mi devolución de llamada de actualización () no se llama.

MyApplication.java

public class MyApplication extends Application{ public static Observable appObserver = new Observable(); public void onCreate(){ super.onCreate(); } } 

Foo.java

 MyApplication.appObserver.notifyObservers( "Hello world" ); 

BarFragment.java

 public class BarFragment extends Fragment implements Observer{ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); MyApplication.appObserver.addObserver(this); } @Override public void onDestroy() { MyApplication.appObserver.deleteObserver(this); super.onDestroy(); } @Override public void update(Observable observable, Object data) { Log.i("BarFragment", data.toString()); // Should log, but doesn't } } 

Lo que es más, traté de garabatear un simple observable de mi propio, y luego todo funcionó como un encanto con la sustitución de public static Observable appObserver = new Observable(); con public static MyObservable appObserver = new MyObservable();

MyObservable.java

 public class MyObservable { protected List<Object> observers = new ArrayList<Object>(); public void addObserver(Object observer){ observers.add(observer); } public void notifyObservers(Object data){ for( int i=0; i<observers.size(); i++ ){ ((Observer) observers.get(i)).update(null, data); } } } 

¿Qué me estoy perdiendo?

Estoy probando esto en un Nexus One con Android 2.3.6 si importa.

Parece que me perdí una parte crucial del mecanismo Observer, al parecer uno tiene que llamar a setChanged() antes de notifyObservers() . Pero la cosa es, setChanged() está protegido y por lo tanto sólo visible a cualquier subclase de Observable.

Así que supongo que no está destinado a ser utilizado de la manera que traté de usar, pero la subclase hackish a continuación funcionará …

 public class MyObservable extends Observable{ @Override public boolean hasChanged() { return true; //super.hasChanged(); } } 

La respuesta de BadCash en realidad no funcionó para mí, pero mi problema surgió del mismo problema con Observable . Tal vez usted está utilizando una implementación más antigua, pero estoy en Java 8. En lugar de hasChanged() , tuve que anular notifyObservers() para siempre establecer a sí mismo para ser cambiado antes de notificar:

 class WorkingObservable extends Observable{ @Override public void notifyObservers(){ setChanged(); super.notifyObservers(); } }; 

Eso hizo el truco para mí. Miré el código fuente y parece que la clase Observable no llama hasChanged() método hasChanged() internamente para decidir si notificar. Sólo comprueba la variable privada changed . Esto probablemente podría haber sido implementado mejor.

  • SSL handshake Excepción en la aplicación navegar desde otros países
  • Android: Cómo dibujar gratis encima de cualquier cosa (cualquier actividad)
  • Android cómo leer varias características BLE con un PriorityQueue
  • ¿Cómo obtengo las preferencias compartidas en Asynctask?
  • Usando Volley en Android 2.3.3 y obteniendo SSLHandshakeException
  • ¿Cuál es la mejor manera de ocultar la contraseña de keystore en Android?
  • Fuga de memoria, Spring para Android
  • 'SourceSets' no se puede aplicar a la advertencia de 'groovy.lang.closure' en Android Studio
  • Cómo obtener JSON Array dentro de JSON objeto?
  • Cambiar el nombre de la aplicación en Eclipse
  • Deserialización polimórfica de JSON con jackson, tipo de propiedad se convierte en "null"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.