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)?

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 su ApiService .
  • Un bus para comunicarse entre varios Fragment en una Activity .
  • 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.

  • ¿Cuál es la manera correcta de burlarse de un RxJava Observable
  • En RxJava, cómo reintentar / reanudar en caso de error, en lugar de completar el observable
  • Obtención perezosa de objetos paginados usando RxJava
  • Android Retrofit 2 + RxJava: escuchar stream sin fin
  • RxJava solicitudes de red y almacenamiento en caché
  • IllegalArgumentException: No se pudo localizar el adaptador de llamada para rx.Observable RxJava, Retrofit2
  • Comprensión de flujos de datos y múltiples suscriptores (con retroadaptación)
  • Filtrar lista de objetos en Rxjava
  • Obtención de información de encabezado con RXJava y Retrofit
  • ¿Qué está causando HTTP FALLA: java.net.SocketException: Socket cerrado?
  • Prueba de Android Realm con RxJava - "abierto desde un hilo sin un Looper" Excepción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.