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
- Android Studio No hay opción "Importar muestra" en el menú Archivo
- Android one OnClick método para varios botones?
- ¿Cómo puedo calcular el hash SHA-256 de una cadena en Android?
- El método getWindow () no está definido para el tipo AlertDialog.Builder
- Calendario de Android, obtener ID de evento
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.
- Cómo cerrar la aplicación total en Android?
- ¿Por qué mi JsonObjectRequest no funciona?
- Android - botón personalizado con forma drawables y un degradado por programación
- Realm findAllSorted por el campo de un archivado
- Desconcertado por el valor de píxeles en Bitmap (pre multiplicado usando setPixel)
- Excepción con la deserialización del marco XML simple
- Redes Android
- No concatene el texto que se muestra con setText. Utilizar cadena de recursos con marcadores de posición
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.