10

Ich habe einen Dienst implementiert, wo ich die Statusänderungen (connect, disconnect, onServiceDiscovered, onCharacteristicChange usw.) behandle und Daten von einem anderen Gerät über gatt Server empfange.Ist es sinnvoll, Broadcast-Empfänger durch Greenrobot Eventbus zu ersetzen, um ereignisbasierte Funktionen auszulösen und Daten von Service zu Aktivität zu übertragen?

Meine Frage ist, können die Ereignisse effizient Greenrobot EventBus ersetzen Rundfunkempfänger zwischen Dienst und Aktivität mit umgegangen werden? Hier

+0

Ich habe Greenrobot Event nicht verwendet, aber ich kann das nicht kommentieren. Aber im Allgemeinen, wenn die Kommunikation zwischen Aktivität und Service desselben Prozesses ist, ist es besser, LocalBroadcastManager als BroadcastReceiver zu verwenden. – kmaini

+0

@kmaini Gibt es ein Beispiel oder einen Link, auf den du gestoßen bist, der dir sehr nützlich ist? –

Antwort

7

Im Gegensatz zu LocalBroadcastManager, EventBus ist einfacher zu verwenden. Sie gehen nur über 3 Schritte:

1- Erstellen Sie eine Ereignisklasse. Eine einfache Java-Klasse, die die Antwort darstellt, wenn die Aktion auftritt.

2- das Ereignis Bus als Abonnent registriert in Ihrer Aktivität onCreate Methode

EventBus.getDefault().register(this); 

Und natürlich austragen es in Ihrer Aktivität onDestroy Methode

EventBus.getDefault().unregister(this); 

3- Die unterzeichnende Methode erstellt wird in derselben Aktivität, die für den EventBus registriert wurde. Beispiel in WorkOrderActivity

@Subscribe 
    public void onEvent(EventClass event) 

Wenn das Ereignis auftreten, sollten Sie die Post-Methode aufrufen, vorbei an der Veranstaltung Objekt, das Sie vorher erstellt.

EventBus.getDefault().post(new EventClass (Data)); 

Wie kmaini erwähnt, können Sie es mit LocalBroadcastManager ersetzen, aber Sie werden die Daten von der Absicht selbst abbilden müssen. Im Gegensatz zu EventBus, die Objekte übergeben kann.

Auch greenrobot, die Schöpfer der EventBus Bibliothek, beantwortet diese Frage here:

Q: Wie ist EventBus anders Android BroadcastReceiver/Intent System?

A: Im Gegensatz zum Android BroadcastReceiver/Intent-System verwendet EventBus Standard-Java-Klassen als Ereignisse und bietet eine bequemere API. EventBus ist für viel mehr Fälle, in denen Sie nicht möchten durch den Aufwand der Einrichtung Intents, Vorbereitung Intent Extras, die Umsetzung Broadcast-Empfänger und Extraktion Intent Extras wieder gehen wollen. Außerdem kommt EventBus mit einem viel geringeren Aufwand.

2

ist der Link Ich folgte für die Umsetzung LocalBroadcast:

https://stackoverflow.com/a/8875292/4406743

Hier Zusammenfassung meiner Umsetzung:

In der Empfangsaktivität oder eine Dienstleistung:

1) Registrieren Sie sich für lokale Braodcast (normalerweise in onCreate):

2) Unregister für lokale broadast (in der Regel onDestroy):

LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 

3) definieren Rundfunkempfänger:

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
         //Handle local broadcast 
      } 
}; 

In der Sendeaktivität oder eine Dienstleistung:

Intent it = new Intent("broacast_name"); 
it.putExtra("data", "value"); 
LocalBroadcastManager.getInstance(context).sendBroadcast(it); 
+0

Event-Bus ist nett lib. Es macht die Codierung sehr einfach und entkoppelt. Mach weiter und benutze es. –

0

EventBus macht die Dinge viel einfacher, weil Sie passieren können beliebige Java in der event.You Objekte entlang ist nicht mit Intents das gleiche tun, weil Ihr Objekt hat Parcelable und die „langweilige“ Parcel Umsetzung zu implementieren, die etwas, das Sie vielleicht nicht, was auf einer vorhandenen Codebasis zu tun ist.

1

Aus einer anderen Perspektive glaube ich Broadcast-Manager in Android verwendet die Nachrichtenwarteschlange Haupt Thread-Handler, um Ereignisse zu verarbeiten. Wenn Sie also einen anderen Thread (wenn Sie keine UI-Ereignisse/Jobs/Tasks haben) mit einer geeigneten Warteschlange verwenden können (z. B. mit einem anderen HandlerThread), können Sie die spezifische Warteschlange dieses Threads für die Verarbeitung Ihrer Jobs nutzen. ohne störende UI-Ereignisse und Mischen Ihrer Sachen mit UI-Arbeit. Sie können auch mit dem Prioritätswert des Threads spielen, um die Arbeit auszugleichen.

Nun, wenn GreenRobot bietet alle Funktionen in ein paar Zeilen Code, dann würde ich es auf jeden Fall versuchen, um jede Leistungssteigerung zu sehen.