2016-06-06 12 views
4

Früher habe ich mit EventBus gearbeitet, das war einfach zu bedienen und leicht zu verstehen. Diesmal möchte ich jedoch RxJava für eine Event-Bus-ähnliche Kommunikation ausprobieren, jedoch ist es nicht sehr klar, wie man Ereignisse von RxJava entfernt oder besser gesagt, wie es so gestaltet werden sollte, dass es ein ähnliches Verhalten wie EventBus hat wenn ich removeStickyEvent anrufe?RxJava als Event-Bus in Android-Projekt - Ereignis aus dem Bus entfernen

In RxJava kann ich BehaviorSubject verwenden, um selbst dann zu antworten, wenn ich diese Observable abonniere, aber was soll ich tun, wenn dieses Ereignis behandelt wird? Was, wenn ich dieses Ereignis nicht noch einmal abspielen lassen möchte?

Zum Beispiel löst ein Fragment ein Ereignis aus und endet dann. Ein anderes Fragment hört auf dieses Ereignis und behandelt es. Wenn diese App dann diese "andere" Aktivität erneut unter verschiedenen Umständen auslöst, wird sie erneut das gleiche BehaviorSubject abonnieren und dieses veraltete Ereignis erneut behandeln, was ich nicht erreichen möchte.

benutzte ich dieses Projekt als Referenz https://github.com/marwinxxii/AndroidRxSamples/blob/master/app/src/main/java/com/github/marwinxxii/rxsamples/EventBusSampleActivity.java

+0

Entschuldigung für eine Nicht-Antwort, aber .. es könnte Es ist einfacher für Sie, die Idee hinter RxJava zu erlernen, und es ist idiomatischer Gebrauch und Muster, anstatt zu versuchen, ein anderes Muster wiederzuverwenden, das in RxJava vielleicht keinen Sinn ergibt. –

Antwort

6

Solange Sie nicht Ihre events sein null, denken zu lassen plane ich, dass ziemlich leicht erreicht werden kann.

Genau wie Sie gesagt haben, könnten Sie BehaviorSubject verwenden sticky Ereignisse zu verbreiten, und wenn Sie removeStickyEvent vom bus möchten, können Sie nur ein null Objekt (zu „flush“ der subject) emittieren.

So etwas (von der Oberseite meines Kopfes - nicht getestet, ohne Generika, nur ein einfaches Object -event basierend Beispiel):

public class RxEventBus { 

    PublishSubject<Object> eventsSubject = PublishSubject.create(); 
    BehaviorSubject<Object> stickyEventsSubject = BehaviorSubject.create(); 

    public RxEventBus() { 
    } 

    public Observable<Object> asObservable() { 
     return eventsSubject; 
    } 

    public Observable<Object> asStickyObservable() { 
     return stickyEventsSubject.filter(new Func1<Object, Boolean>() { 
      @Override 
      public Boolean call(Object o) { 
       return o != null; 
      } 
     }); 
    } 

    public void postEvent(@NonNull Object event) { 
     eventsSubject.onNext(event); 
    } 

    public void postStickyEvent(@NonNull Object stickyEvent) { 
     stickyEventsSubject.onNext(stickyEvent); 
    } 

    public void removeStickyEvent(){ 
     stickyEventsSubject.onNext(null); 
    } 
} 
+0

das ist ein interessantes Konzept. Vielen Dank. –

+0

Fühlen Sie sich frei, die Antwort zu akzeptieren, wenn es Ihnen geholfen –

+0

Ich denke jetzt .... wenn ich 'BehaviorSubject' verwende und meine App zwei Netzwerkanrufe an verschiedene Dienste sendet, navigiert dann zu einer anderen Aktivität, wenn diese andere Aktivität dann zuhören wird zu diesen beiden Ereignissen wird es nur ein unbehandeltes Ereignis erhalten, nicht zwei. Das ist nicht gut AFAIK. Gibt es eine Möglichkeit, dass es funktioniert? –

Verwandte Themen