2017-03-10 11 views
2

Ich versuche, eine Liste von Objekten ActivityTwo-MainActivityEventBus Verwirrung

ich get started page EventBus die gefolgt zu senden und zu genannt register() und unregister() Methoden aus onStart und OnStop, dann verwendet i EventBus.getDefault().post() die Daten zu senden.

Auf MainActivity Ich bekomme nichts, wenn ich den unregister() Anruf von onStop() entfernen.

Meine Frage ist, verwende ich es richtig? sollte ich unregister() in onDestroy() anrufen? wenn ja, warum rufen sie es von onStop wenn es nicht etwas abholen, wenn die Aktivität gestoppt wird

MainActivity

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(YoutubeData event) { 

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

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

ActivityTwo

private void sendYoutubeData() { 
     if(youtubeData != null){ 

      EventBus.getDefault().post(youtubeData); 
      finish(); 
     } 

} 

Antwort

2

Wenn Sie möchten, Erhalten Sie das Ereignis in MainActivity, wenn es nicht sichtbar ist, ja, Sie sollten Ihre register() bzw. unregister() inplatzierenund onDestroy().

Wenn für Ihre Veranstaltung keine Zuhörer vorhanden sind, werden sie niemals empfangen, AUSSER wenn es sich um ein Problem handelt, in welchem ​​Fall Sie es bei der Registrierung erhalten können. Weitere Informationen über Haftnotizen here

+0

Dies beantwortet die Frage, ist aber nicht der beste Anwendungsfall für diese einfachen Aufgaben. –

2

Das Problem ist, dass Sie die Liste mit der Post-Linie des Ereignisbusses veröffentlichen müssen, und dann onEvent() in Ihrer Klasse überschreiben müssen. here ist ein Link, der hilfreich sein wird.

, was Sie tun müssen, ist zusätzliche Ereignisse definieren wie

public static class MessageEvent { /* Additional fields if needed */ } 

jetzt von dem Teil, wo Sie die Daten, die Sie auf das Ereignis per Post erhalten.

In Ihrer Aktivität legen Sie eine Teilnehmerfunktion fest, die ausgelöst wird, wenn Daten an den Ereignisbus gesendet werden. und dort verwenden Sie die gebuchten Daten

public void onMessageEvent(MessageEvent event) {/* Use the data*/}; 
2

Sie werden jedes Ereignis nicht erhalten, da Sie in der Aktivität zwei, sind die erste Aktivität bedeutet, ist in einem Zustand „Stopped“. Je nachdem, was Sie erreichen möchten, können Sie versuchen, startActivityForResult oder erstellen Sie ein Sticky-Ereignis, aber ich würde nicht empfehlen, Event-Bus für einfache Operationen wie diese verwenden, da es zu unangenehmen schwer zu Debugging-Fehler führen kann.

Also ich empfehle Ihnen, mit Option 1 zu gehen, verwenden Sie startActivityForResult.

-1

Wenn Sie Ereignisse zu Ihrer Aktivität erhalten möchten, wenn Ihre Aktivität keinen Fokus hat, dann machen Sie wahrscheinlich etwas falsch. Ich würde vorschlagen, das Subskribentenmaterial in eine statische Singleton-Klasse zu verschieben und von dieser Klasse die Aktivität mit einer Absicht und einigen Parametern zu starten, wenn Sie eine Situation verwalten müssen.