2015-03-24 17 views
19

Was ist der beste Ort, um registrieren und unregister zu einem Event-Bus (wie Ootto, EventBus oder Tipibus) in einer Aktivität und warum?Welche Aktivitätslebenszyklusmethoden eignen sich am besten zum Registrieren/Abmelden am Ereignisbus?

  1. onCreate() - onDestroy()
  2. onStart() - OnStop()
  3. onResume() - onPause()

Ottos Beispiel verwendet onResume() - onPause(), EventBus erwähnt onStart() - onStop(), und wir mussten onCreate() - onDestroy() in unserer App verwenden, um die Benutzeroberfläche der Aktivität zu aktualisieren, auch wenn sie im Hintergrund war. Also ich denke, dass es eine der drei sein kann, abhängig von der Art der Ereignisse und deren Handhabung, aber ich fragte mich, ob es noch etwas mehr gibt, das in Betracht gezogen werden sollte.

+1

Ich brauche 'onCreate() - onDestroy()' auch. Hast du irgendwelche Nachteile gefunden? – aandis

+1

@zack, nein Ich habe zu der Zeit keine Nachteile gefunden, aber es war nur eine PoC-App, also war es keine umfangreiche Erfahrung – levavare

+0

@levavare, Bitte markieren Sie eine der untenstehenden Antworten als akzeptiert. Es hört sich so an, als ob du dich mit Jordys Antwort/Link einverstanden erklärst, aber das hat nicht die meisten Upvotes, also ist es schwerer zu finden. –

Antwort

6

@levavare, ich glaube, die richtige Zeit zu registrieren/unregister hängt von Ihren Veranstaltungen und was Sie beabsichtigt, mit ihnen zu tun. Und kann für verschiedene Ereignisse innerhalb der gleichen Anwendung unterschiedlich sein.

Zum Beispiel verwende ich EventBus in einer Android-App, die ein Echtzeit-Datenerfassungsgerät (in diesem Fall Arduino) über Bluetooth überwacht. Ich habe zwei ziemlich verschiedene Arten von Ereignissen.

Das erste Ereignis wird von meinem Bluetooth-Code gesendet, um eines meiner Fragmente zu benachrichtigen, dass eine neue Reihe von Instrumentenmesswerten vom Gerät empfangen wurde. Dieses Fragment schreibt sie dann in eine Datenbanktabelle. Es ist wichtig, dass das Ereignis immer gehört und gehandelt wird. Das Fragment registriert/hebt die Registrierung in seinen OnCreate/OnDestroy-Methoden auf. Ich abonniere diese Veranstaltung auch mit erhöhter Priorität.

Das andere Ereignis wird von der Datenbankschicht bereitgestellt, wenn der neue Datensatz zur Datenbank hinzugefügt wird. Ich habe eine Reihe von Fragmenten, die verschiedene Teilmengen der Messwerte (Temperaturen, Drücke, Alarmzustände) zeigen. Wenn eines dieser Fragmente angezeigt wird, sollte es aktualisiert werden, sobald sich der neue Messwert in der Datenbank befindet. Aber wenn das Fragment außer Sichtweite ist, gibt es keinen Grund dafür, auf eine Lesung zu reagieren. Ich habe diese Fragmente in OnStart/OnStop registrieren/abmelden. Ich würde diese Arbeit in OnResume/OnPause machen und, ehrlich gesagt, ich denke, dass es dort auch für meine App funktionieren würde. Aber @ Jordys Antwort und der Link haben mich überzeugt, stattdessen mit OnStart/OnStop zu gehen.

12

Zunächst ist es keine objektive Frage, sondern eine subjektive Frage und wird viele Argumente basierend auf Argumenten ziehen.

Aus meiner Erfahrung, Wir verwendeten Otto in einem unserer Projekte. Wir folgten onResume() - onPause() was uns sehr gut tat. Es macht auch Sinn, denn wir sollten uns so spät wie möglich registrieren & so schnell wie möglich abmelden, während Sie einen Event-Bus verwenden.

+0

"so spät wie möglich und so schnell wie möglich abmelden" - danke, guter Punkt, macht auch aus Sicht der Performanceverteilung Sinn, obwohl ich mir nicht sicher bin, wie wichtig es wirklich ist. Aber ich denke, ausgehend von onResume-onPause und bewegt 'nach oben', wenn nötig, macht Sinn. – levavare

+0

ja. Je nach Szenario zu bewegen ist die beste Taktik, denke ich. Würdest du bitte die Antwort akzeptieren, wenn sie deinem Zweck dient? –

+18

Was ist mit dem Verlust der abgesendeten Ereignisse, während die App im Hintergrund war? – gyosida

3

Ich entfernte meinen Kommentar in der obigen Antwort, dass es am besten wäre, in onresume/onpause zu registrieren/abzumelden. Ich habe einen seltsamen Anwendungsfall, wenn einige nicht den annotierten Abonnenten erreichten. Scheint der beste Weg ist, den onstart/onstop zu verwenden. Hier ist ein gute SO schreiben zu erklären, warum:

https://stackoverflow.com/a/19737191/2361947

+0

Danke! Ich habe hinzugefügt und aktualisiere es in der Frage. Die Antwort ist immer noch nicht offensichtlich Ich denke, wenn es eine definitive Antwort geben wird, werde ich wieder aktualisieren. Es sieht für mich aus, dass die Verwendung von Nachrichtenbussen einige unserer Probleme löst und einige andere generieren kann. – levavare

+0

Yup onStart/onStop ist besser, da es Nachrichten empfangen kann, wenn das Telefon gesperrt ist. ODER sagen, dass eine empfangene GCM-Nachricht über Otto an die Aktivität übergeben werden kann – Pranaysharma

0

Formular EventBus Documentation, die ich gefunden und es funktioniert gut für mich:

@Override 
public void onStart() { 
    super.onStart(); 
    EventBus.getDefault().register(this); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    EventBus.getDefault().unregister(this); 
} 

Und wenn Sie den EventBus Bezug auf das Kind senden dann:

private EventBus eventBus = EventBus.getDefault(); 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ....... 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if(!eventBus.isRegistered(this)){ 
     eventBus.register(this); 
    }else{ 
     Log.e(TAG, "EventBus is registered"); 
    } 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if(eventBus.isRegistered(this)){ 
     eventBus.unregister(this); 
    }else{ 
     Log.e(TAG, "EventBus is not registered"); 
    } 
}