Was ist effizienter-Broadcast-Empfänger oder Hf?
Ich weiß, dass onReceive() des Broadcast Receivers und handleMessage() des Hf laufen auf dem selben UI-thread. Angenommen, ich möchte die Kommunikation zwischen zwei services innerhalb der gleichen app (Prozess) . Ich kann verlängern, ein broadcast receiver-Klasse und Registrierung eines Ereignis -
ODER
einen Handler und übergeben Sie dann die Instanz auf den anderen Dienst verwendet werden, für die sendMessage () - Aufrufe. In beiden Fällen würde ich brauchen, um einige neue switch-case. Aber welcher Ansatz ist effizienter ? Nehmen wir an, dass der code threadsicher ist (keine UI updations).
- Ist dein problem gelöst oder brauchst du weitere Hilfe? Bitte vergessen Sie nicht, akzeptieren Sie die Antwort, die Ihnen bisher am meisten geholfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du meinst, dass Sie tun dies über
LocalBroadcastManager
(siehe Herr Kapeller ist ausgezeichnete Antwort für details),Handler
wird etwas effizienter, alsLocalBroadcastManager
verwendet eineHandler
. Aber der performance-Unterschied sollte nicht genug, um Materie. Das gleiche gilt für andere in-Prozess-Ereignis-bus-Implementierungen wie greenrobot ist EventBus und Square Otto. Alles sollte schnell genug sein, dass andere Belange, wie Wartbarkeit, sollte vorrangig sein.Wenn du meinst, dass Sie tun dies über die system-Sendungen (z.B.
sendBroadcast()
eineContext
), dannHandler
,LocalBroadcastManager
oder andere event-bus-Implementierungen deutlich schneller und sicherer als gut.All dies setzt Voraus, dass die beiden services werden im selben Prozess.
Die Schnellste Lösung von allen ist die Kombination der beiden Dienste in einem. Dies ist besonders wahr, wenn Sie haben die gleiche Lebensdauer. Es gibt viele Fälle, wo die 2+ - Dienste in einer app ist vernünftig, aber nicht viele unabhängige kleine Leistungen ohne klaren Grund, so zu tun.
Sollten Sie nicht verwenden die normalen übertragungen für die Kommunikation zwischen
Activities
undServices
innerhalb der eigenen app. Sie sollten verwenden Sie lokale broadcasts statt! Zuerst müssen Sie definieren eineBroadcastReceiver
wie für normale Sendungen:Danach können Sie die
LocalBroadcastManager
wie diese:Und Sie können sich die
BroadcastReceiver
wie diese (normalerweise registrieren Sie einenBroadcastReciever
imonResume()
):Vergessen Sie nicht, um die Registrierung der
BroadcastReceiver
später (inonPause()
):Und schließlich können Sie die lokale Sendungen wie diese:
this
eher als getActivity() im service-Fall.Broadcast-Empfänger fordert, sind schwere Operationen, und es gibt Chancen, ANR, wenn ein Ereignis ausgestrahlt für mehrere Male. Und auch die Rahmen erhalten Sie in onReceive() des Broadcast Receivers ist von begrenztem nutzen, bis Sie Anwendungskontext.
Dagegen handler ruft die effizient sind, wie Sie sind einfach und läuft in den anderen thread und kein Kontext erforderlich ist, um starten Sie eine Prozedur aufrufen. Kommunikation zwischen 2 Diensten, Aktivitäten oder 2 threads, die leicht gehandhabt werden können mit hf. Infact all die anderen Möglichkeiten, nämlich.. Absichten und Gebunden-Dienste verwenden Handler intern für message-passing.