2017-01-15 5 views
3

Ich habe eine einfache Methode erstellt, die Nachricht (als Object) an ein bestimmtes Thema senden wird. Am anderen Ende wird der Teilnehmer das Objekt konsumieren.RxJava: So senden Sie einige zusätzliche Informationen an Abonnenten

Ich werde das gleiche Thema für mehrere Verbraucher verwenden, daher während des Sendens von Nachrichten möchten einige zusätzliche Informationen, z. B. 200, 300 senden. So kann Verbraucher unrelevante Nachrichten herausfiltern. Aber irgendwie nicht in der Lage herauszufinden, wie das geht.

Zusatzinfo (int-Parameter) können bei postToSubject Verfahren behandelt werden und bei action1 aber nicht sicher, wie es zu platzieren hier subject.onNext(object)

Bitte vorschlagen, wenn Sie eine Lösung denken.

public void postToSubject(Object object, Subject subject) { 
    Observable<Object> observable = Observable.create(new Observable.OnSubscribe<Object>() { 
     @Override 
     public void call(Subscriber<? super Object> subscriber) { 
      subscriber.onNext(object); 
      subscriber.onCompleted(); 
     } 
    }); 
    observable.subscribe(new Action1() { 
     @Override 
     public void call(Object object) { 
      subject.onNext(object); 
     } 
    }); 
} 

obiges Verfahren wird, wie unten genannt (von einer Android-Aktivität, Ziel ist Artikel senden zu unterziehen. Subject durch zweites Argument in der Methode zurückgegeben werden)

Method call

An einem anderen Android Component Class (von Linear Layout geerbt), wird diese Nachricht wie folgt konsumiert. Wenn ich zusätzliche Informationen erhalten kann, d. H. 200, 300, werde ich herausfiltern und next() darin einfügen. So kann ich mir eine Lösung vorstellen, jedoch kann ein RxJava-Experte eine gute Lösung geben.

consume message

Antwort:

Zusätzliche Informationen über OnNext() übergeben, wie unten, werden Teilnehmer mit if (object instanceof Integer) überprüfen und die Logik setzen den nächsten Wert von nächsten OnNext()

zurück zu holen

Result

+0

Nicht sicher, was Sie meinen. Könnten Sie etwas mehr Code hinzufügen, damit wir Ihre Absicht besser verstehen? Mach dir keine Sorgen, wenn es nicht kompiliert. – Bohemian

+0

@Bohemian - danke für die Formatierung und Ihr Interesse .. haben vollständigen relevanten Code 1) Methode 2) Methode Anruf 3) Verbrauch .. angebracht lassen Sie mich bitte wissen, wenn Sie weitere Informationen benötigen ..FYI, das funktioniert einwandfrei, aber aufgrund mehrerer mögliche Verbraucher, muss ich es mit zusätzlichen Parametern filtern – Girish

Antwort

1

Zuerst würde ich Object nicht als Parameter/Nachrichtentyp verwenden, weil es t ist oo generisch. Machen Sie eine Basisklasse, sagen Sie Item, mit grundlegenden Informationen.

Zweitens schaffen Subklassen der Item, sagen MenuItem, ButtonItem, ParametrizedItem, und so weiter. Jeder Subtyp kann zusätzliche Informationen enthalten.

Drittens das ist, was postToSubject() aussehen sollte:

public void postToSubject(Item object, Subject<Item> subject) { 
    subject.onNext(object); 
} 

(keine Notwendigkeit für Observable.create ...)

Viertens auf Verbraucherseite Verwendung filter() Betreiber:

subject 
    .filter(i -> i instanceof MenuItem) 
    .subscribe(menuItemSubscriber); 
subject 
    .filter(i -> i instanceof ParametrizedItem) 
    .subscribe(paramertizedItemSubscriber); 

Jetzt, da jeder Abonnent weiß, welche Subtype-Elemente er erhalten wird, kann er sicher in diesen Subtype umwandeln und zusätzliche Informationen extrahieren Dieser Subtyp betreffende

+0

Vielen Dank für guten Vorschlag, ich bin in meinem Code enthalten. Allerdings scheint mein Problem immer noch dort zu bleiben .. innerhalb der gleichen Unterklasse sagen MenuItem .. Ich muss einen Abonnenten aus vielen auswählen, um das zu tun, muss ich zusätzliche Werte senden .. dh 200 & 300 .. Gibt es einen Weg zu senden Sie zusätzliche Werte und filtern Sie basierend auf diesen Werten heraus. – Girish

+0

@Girish Sie können auf jedes Prädikat filtern. Zum Beispiel: '.filter (i -> i.getParam()> = 200 && i.getParam() <300)'. Hinweis: Ich verwende hier Java-8-Lambda-Notation, in früheren Javas sollten Sie stattdessen anonyme Klassen verwenden. –

+0

Danke nochmal, zusaetzliche Info mit einem weiteren onNext() gesendet, siehe Antwort in Frage selbst. MenuItem hat nicht alle Informationen, daher mussten zusätzliche Informationen separat gesendet werden, d. Ihr Vorschlag war wirklich sehr hilfreich und gab mir mehr Verständnis für RxJava. – Girish

Verwandte Themen