Sustitución de EventBus por RxJava – N suscriptores siempre escuchando
Estoy reemplazando un patrón RxJava
con RxJava
en una aplicación para Android. Tuve eventos para alertar a las partes interesadas de las actualizaciones de los datos en mi singleton caché. Cada vez que se llamaba a un servicio web, los datos se actualizarían y los suscriptores serían alertados a través de un evento publicado.
Tengo algo cercano a este conjunto en RxJava con AsyncSubject
. Los observadores obtienen un solo evento del sujeto, pero luego reciben un evento onComplete
y se dan de baja. Esto funciona a medida que la interfaz de usuario se carga primero, pero cuando hay que actualizar los datos, no hay suscriptores que se notifiquen. ¿Cómo puedo decirle a esos Subscribers
que sigan escuchando más onNext
sucesos siguientes del Subject
?
- Cómo manejar la rotación con Retrofit y RxJava / RxAndroid en Actividad?
- Si se realiza la llamada onComplete para un Asunto RxJava, ¿tengo que anular la suscripción manualmente de nuevo?
- RxJava reintentoCuando vuelve a suscribir la propagación
- RXJava cómo tratar de conseguir después de x tiempo
- Android RxJava que se une a las listas
Necesito un Subject
que informe el elemento más reciente. PublishSubject
sólo emite elementos después de la suscripción, por lo que no cumple mis necesidades. Mis suscriptores empiezan a observar en diferentes momentos (posiblemente después del primer evento de datos), así que necesito que el Sujeto emita el último elemento observado y luego mantenga el flujo abierto para los elementos siguientes. Parece que una combinación de AsyncSubject y PublishSubject es lo que necesito. ¿Hay alguna manera de lograr esto con las clases incorporadas, o necesito crear mi propio tema?
WebServiceObservable OR CacheObservable ^ | AsyncSubject ^ | / \ / \ / \ UiObserver1 UiObserver2
- AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
- Comportamiento de onNext y onComplete
- RxJava y MVP en la aplicación para Android
- RxAndroid filter Observable <List <Item >>
- Rx java retrofit 2 manejo de errores
- Inter fragmento de comunicación utilizando rxjava
- Operadores RxJava
- Retrofit / Rxjava y servicios basados en sesiones
Un poco de respuesta tardía, pero una opción un poco mejor para su scenarion que el BehaviorSubject podría ser BehaviorRelay de RxRelay lib . Y también para soluciones más globales cuando se necesitan diferentes comportamientos, pero quieren compartir punto único de interacción entre todos los módulos que puede utilizar RxHub
BehaviorSubject
se ajustará a sus necesidades. https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject
Si necesita un comportamiento más sofisticado, siempre puede escribir su propia implementación de Subject
. Parece bastante sencillo hacerlo.
Creo que es más simple si se utiliza BehaviorSubject con el operador switchOnNext.
SwitchOnNext () convierte un Observable que emite Observables (BehaviorSubject en este ejemplo) en un solo Observable que emite los ítems emitidos por los más recientemente emitidos de los Observables
El Observable devuelto por switchOnNext () se cancela la suscripción de la previamente emitida Observable empieza a emitir elementos de la última Observable
public class PhotoModel{ BehaviorSubject<Observable<Photo>> subject = BehaviorSubject.create(...); public void setUserId(String id){ subject.onNext(Api.getUserPhoto(photoId)); } public Observable<Photo> subscribeToPhoto(){ return Observable.switchOnNext(subject); } }
¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
- ¿Cómo grande es pequeño, normal, grande y xlarge?
- Android notifyItemRangeInserted deshabilitar autoscroll