RxJava como autobús de eventos?
Estoy empezando a aprender RxJava y me gusta hasta ahora. Tengo un fragmento que se comunica con una actividad en el botón de clic (para reemplazar el fragmento actual con un nuevo fragmento). Google recomienda interfaz para fragmentos para comunicarse con la actividad, pero es demasiado detallado, traté de utilizar receptor de difusión que funciona en general, pero tenía inconvenientes.
Desde que estoy aprendiendo RxJava me pregunto si es una buena opción para comunicarse de los fragmentos a las actividades (o fragmento a fragmento) ?. Si es así, cuál es la mejor manera de usar RxJava para este tipo de comunicación ?. ¿Necesito hacer bus de eventos como éste y si ese es el caso, debo hacer una sola instancia del bus y usarlo globalmente (con temas)?
- Android Rxjava suscribirse a un cambio de variable
- Compruebe que el método se llama en onNext del suscriptor de RxJava
- Reino se cierra
- Cancelación de varias suscripciones a la vez en RxAndroid - Android
- Hilo predeterminado de actualización
- RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
- Observable.just () que devuelve Unidad en Kotlin
- Robolectric + OkHttp + retrofit + prueba de unidad rxJava
- Cómo emitir elementos de una lista con retraso en RxJava?
- Arquitectura de la aplicación de Android: RxJava
- Android: Realm.getInstance (context) devuelve una instancia de dominio ya cerrada
- Encadenar dos observables de adaptación con RxJava
- RxJavaCallAdapterFactory no se puede convertir en Factory
Sí y es bastante sorprendente después de aprender a hacerlo. Considere la siguiente clase singleton:
public class UsernameModel { private static UsernameModel instance; private PublishSubject<String> subject = PublishSubject.create(); public static UsernameModel instanceOf() { if (instance == null) { instance = new UsernameModel(); } return instance; } /** * Pass a String down to event listeners. */ public void setString(String string) { subject.onNext(string); } /** * Subscribe to this Observable. On event, do something eg replace a fragment */ public Observable<String> getStringObservable() { return subject; } }
En su Actividad, esté listo para recibir eventos (por ejemplo, tenerlo en la página onCreate):
UsernameModel usernameModel = UsernameModel.instanceOf(); //be sure to unsubscribe somewhere when activity is "dying" eg onDestroy subscription = usernameModel.getStringObservable() .subscribe(s -> { // Do on new string event eg replace fragment here }, throwable -> { // Normally no error will happen here based on this example. });
En usted Fragmento pasar el evento cuando se produce:
UsernameModel.instanceOf().setString("Nick");
Su actividad entonces hará algo.
Consejo 1: Cambie la cadena con cualquier tipo de objeto que desee.
Consejo 2: Funciona también muy bien si tiene inyección de dependencia.
Actualmente pienso que mi enfoque preferido a esta pregunta es éste:
1.) En lugar de un bus global que maneja todo a lo largo de la aplicación (y, en consecuencia, se vuelve bastante difícil de manejar), utilice los autobuses "locales" para propósitos claramente definidos y sólo conéctelos donde los necesite.
Por ejemplo, usted podría tener:
- Un bus para enviar datos entre su
Activity
y suApiService
. - Un bus para comunicarse entre varios
Fragment
en unaActivity
. - Un bus que envía el color del tema de la aplicación seleccionada actualmente a todas las
Activity
s de modo que puedan tintar todos los iconos en consecuencia.
2.) Utiliza Dagger (o quizás AndroidAnnotations si lo prefieres) para hacer el cableado-todo-juntos un poco menos doloroso (y también para evitar un montón de instancias static
). Esto también hace que sea más fácil, por ejemplo, tener un único componente que sólo se ocupa de almacenar y leer el estado de inicio de sesión en SharedPreferences
. Este componente también podría conectarse directamente a su ApiService
para proporcionar el token de sesión para todas las solicitudes.
3.) Siéntase libre de usar los Subject
s internamente, pero "lanzarlos" a Observable
antes de entregarlos al público llamando a return subject.asObservable()
. Esto evita que otras clases empujen valores al objeto a los que no se debe permitir.
- El método showDialog (int) del tipo Actividad está obsoleto en android?
- Cómo definir un Charset nuevo en Java / Android?