RxJava come bus di evento?

Sto iniziando ad imparare RxJava e mi piace finora. Ho un frammento che comunica con un'attività sul clic del button (per sostituire il frammento corrente con un nuovo frammento). Google raccomanda l' interface per i frammenti di comunicare all'attività, ma è troppo esuberante, ho provato a utilizzare il ricevitore di trasmissione che funziona generalmente, ma ha avuto inconvenienti.

Dato che sto imparando RxJava mi chiedo se sia una buona opzione per comunicare da frammenti a attività (o frammento a frammento) ?. In caso affermativo, qual è il modo migliore per utilizzare RxJava per questo tipo di comunicazione ?. Devo fare un bus di events come questo e se questo è il caso dovrei fare una singola istanza del bus e utilizzarla globalmente (con soggetti)?

  • java.lang.VerifyError
  • Come posso generare una notifica diversa sul dispositivo e l'usura?
  • La libreria chiave Android ha smesso di funzionare
  • Errore: causa: com.android.sdklib.repository.FullRevision
  • Come interrompere la function Touch To Explore di TalkBack nella mia applicazione
  • Perché Android recupera il tipo di visualizzazione errato nel mio SpinnerAdapter?
  • Aggiunta di uno strumento personalizzato alla shell adb android
  • Qual è la differenza tra ACTION_CANCEL e ACTION_UP in MotionEvent?
  • Configura l'eclisse per utilizzare il mio SDK Android (framework.jar)
  • I campioni nativi OpenCV non stanno costruendo
  • Delphi Android Solution / ARM7 con il mercato di NEON?
  • JSON Array di stringhe (senza oggetti), estrazione di dati
  • 2 Solutions collect form web for “RxJava come bus di evento?”

    Sì, ed è piuttosto sorprendente dopo aver imparato a farlo. Si consideri la seguente class singola:

    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; } } 

    Nella tua attività essere pronto per ricevere gli events (ad es. Nel programma 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. }); 

    In voi, il frammento passa l'evento quando si verifica:

     UsernameModel.instanceOf().setString("Nick"); 

    La tua attività allora farà qualcosa.

    Suggerimento 1: Modificare la string con qualsiasi tipo di object che ti piace.

    Suggerimento 2: Funziona anche ottimo se hai iniezione di dipendenza.

    Attualmente ritengo che il mio approccio preferito a questa domanda è quello di:

    1.) Invece di un bus globale che gestisce tutto in tutta l'applicazione (e di conseguenza diventa abbastanza ingrato) utilizzare autobus "locali" per scopi chiaramente definiti e solo collegarli where li serve.

    Ad esempio potrebbe essere necessario:

    • Un bus per l'invio di dati tra la tua Activity e l' ApiService .
    • Un bus per comunicare tra diversi Fragment di un'attività.
    • Un bus che invia il colore del tema dell'app di selezione corrente selezionato a tutte le Activity s in modo che possano tinteggiare tutte le icone di conseguenza.

    2.) Utilizzare Dagger (o forse AndroidAnnotations se lo preferisci) per rendere il cablaggio – tutto insieme un po 'less doloroso (e per evitare anche un sacco di istanze static ). Ciò rende più facile anche per esempio avere un singolo componente che si occupa solo di memorizzare e leggere lo stato di login nelle SharedPreferences – questo componente potrebbe anche essere cablato direttamente ApiService per fornire il token di session per tutte le richieste.

    3.) Sentitevi liberi di usare i Subject s all'interno ma "lanciarli" in Observable prima di consegnarli al pubblico chiamando il return subject.asObservable() . Ciò impedisce ad altre classi di spingere i valori nel Subject cui non dovrebbe essere consentito.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.