2016-07-04 23 views
2

Ich möchte EventBus (von Greenrobot oder anderen) für die Kommunikation zwischen den Komponenten meiner Android-Anwendung verwenden. Im gesamten Beispiel wurde das Pub/Sub unter Verwendung einer "Klasse" als ein "Thema" implementiert, d. H. Jeder Teilnehmer deklariert die genaue Klasse von Ereignissen, die er erhalten sollte.EventBus auf Android: Wie man dynamische Warteschlangen gegen klassenbasiertes Ereignisabonnement implementiert?

Ich frage mich, ob es einen dynamischeren Mechanismus gibt.

Hier ist, was ich erreichen muss: Meine App muss Befehle (sagen wir "Hallo!") An mehrere Systeme senden: 1, 2, ... N. Die Struktur des Befehls ist für alle gleich Sie.

So macht es Sinn, dass der Verlag in der Lage sein wird, an Warteschlangen "command/1", "command/2", ... "," command/N "zu senden - aber es macht keinen Sinn erfordert jedes System eine "CommandN" Klasse zu definieren.

Jede intelligente Art und Weise, dies zu erreichen, während die pub/sub Entkopplung zu halten?

Vielen Dank im Voraus,

Max

Antwort

1

eine einfache Art und Weise Ich empfehle, indem Sie eine Variable als einen Befehl in der Ereignisklasse hinzufügen

Jeder Abonnent wird das Ereignis erhalten, aber nur etwas tun, wenn die Befehlsnummer mit seiner Anforderung übereinstimmt.

Hier Beispielcode für EventBus:

public class CommandEvent{ 
    private int command; 

    public CommandEvent(int command) { 
    this.command = command; 
    } 

    public int getCommand() { 
    return command; 
    } 
} 

Dann in Ihrem jeden Teilnehmer:

@Subscribe 
protected void onMessage(CommandEvent event) { 
    // Only do something when it's its command it want. 
    if(event.getCommand() = myCommandId) { 
    // do something here. 
    } 
} 
+0

Thanks a lot, wird dies funktionieren, aber im Grunde bedeutet es, dass alle Teilnehmer alle Befehle erhalten, und Filterung erfolgt im Code. Dies ist nicht "sauber" Pub/Sub IMHO. Irgendein besserer Vorschlag? – Max

+0

Derzeit habe ich nicht. Warten auf andere Idee und Antwort von anderen: P –