2016-04-17 10 views
2

Ich versuche, die absolute Basisimplementierung von EventBus Library für Android zu implementieren.Simple EventBus - Keine Abonnenten Registriert

Was ich versuche einfach Inhalt von Benutzer in activity 1 eingeben und dann statt Absicht Extras Ich bin Eventbus verwenden, um das gesamte Objekt auf die nächste Aktivität - . Ich verfolge genau die vorgegebenen Richtlinien:

PART 1: POJO

public class StudentEvent { 

    public final String registrationNumber ; 
    public final String name ; 
    public final String course ; 
    public final String branch ; 

    public StudentEvent(String registrationNumber, String name, String course, String branch) { 
    this.registrationNumber = registrationNumber; 
    this.name = name; 
    this.course = course; 
    this.branch = branch; 
    } 

    public String getRegistrationNumber() { 
    return registrationNumber; 
    } 

    public String getName() { 
    return name; 
    } 

    public String getCourse() { 
    return course; 
    } 

    public String getBranch() { 
    return branch; 
    } 
} 

PART 2: Subscription in the second activity

EventBus.getDefault().register(this); //onCreate 

EventBus.getDefault().unregister(this); //onDestroy 

@Subscribe 
public void eventReceiver(StudentEvent studentEvent){ 
    tvRegistrationNumber.setText(studentEvent.getRegistrationNumber()); 
    tvName.setText(studentEvent.getName()); 
    tvBranch.setText(studentEvent.getBranch()); 
    tvCourse.setText(studentEvent.getCourse()); 
} 

PART 3: Post the event

StudentEvent studentEventObject = new StudentEvent(
      etRegistrationNumber.getText().toString(), 
      etName.getText().toString(), 
      etCourse.getText().toString(), 
      etBranch.getText().toString()) ; 

EventBus.getDefault().post(studentEventObject); 

ich den Fehler:

D/EventBus: No subscribers registered for event class co.swisdev.abhinav.eventbustesting.StudentEvent 
D/EventBus: No subscribers registered for event class org.greenrobot.eventbus.SubscriberExceptionEvent 

WAS VERMISSE ICH?
Es funktioniert, wenn ich das Abonnement in der gleichen Klasse machen.

Antwort

6

Dies scheint ein Timing-Problem zu sein. Aktivität 2 muss registriert sein, um das Ereignis zu erhalten. Wenn Sie die Veranstaltung aus Aktivität 1 buchen, gibt es keine Garantie, dass Aktivität 2 erstellt wurde.

+0

richtige Antwort, braucht aber etwas mehr konkretisiert werden eine große Antwort. Vielleicht möchten Sie auf Activity Lifecycle zeigen und erklären, warum dies nicht die richtige Anwendung eines EventBus ist. – 323go

+1

Was ist die beste Modifikation, die ich dann machen muss? Sollte ich die Absicht machen und dann Veranstaltung zu EventBus buchen? @ 323go –

+0

@AbhinavJordieDas Dies ist nicht die Art der Sache, für die der EventBus normalerweise verwendet wird. Im Allgemeinen wird der EventBus verwendet, um aktualisierte Daten für eine bereits aktive Aktivität oder ein Fragment zu erhalten. Stellen Sie sich den EventBus eher als Wrapper um einen Beobachter/Verbraucher vor. In diesem Beispiel sieht es so aus, als ob Sie damit Daten an eine andere Aktivität übergeben. Ich denke, Sie sind besser dran mit Standard-Mittel, um ein Bündel zu verwenden, oder speichern Sie es in einem Modell und Zugriff auf das Modell in Aktivität 2. –

3

Obwohl dies keine Antwort ist, aber ich denke, das ist relevant für EventBus Benutzer. Per EventBus documentation, müssen wir EventBus in onStart() und deregistrieren in onStop()

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

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

registrieren Wenn nicht EventBus.getDefault put() registrieren (this). in onCreate. onEvent Die Teilnehmer können das Feuer nicht erleiden.

activity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act_fragment_layout); 

     EventBus.getDefault().register(this); 

    } 

    public void onEvent(AccountSelectedEvent event) { 
     FragTaxCustomsInfo frag = (FragTaxCustomsInfo) getSupportFragmentManager() 
       .findFragmentByTag(FragTaxCustomsInfo.TAG); 
     frag.paymentSelected(); 
    } 

    public void onEvent(AccountSelectedUpdateIndexEvent event) { 
     FragTaxCustomsInfo frag = (FragTaxCustomsInfo) getSupportFragmentManager() 
       .findFragmentByTag(FragTaxCustomsInfo.TAG); 
     frag.setSelectedPayment(event.getIndex(), false); 
    } 
1

das gleiche Problem hat, vielleicht könnte dies helfen. Dies ist ein Zeitproblem, wie von @JesseBuss angegeben, da Activity2 vollständig erstellt und registriert werden muss, um Ereignisse zu empfangen. Es gibt jedoch eine Möglichkeit, die Übertragung des Objekts von Activity1 zu Activity2 zu gewährleisten, erfordert jedoch etwas mehr Code. Um dies zu tun, sollte Activity2 ein Ereignis abonnieren, das von Activity1 und Activity1 veröffentlicht wird, sollte auch ein Ereignis abonnieren, die von Activity2 gebucht werden. Zum Beispiel:

Activity1

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    EventBus.getDefault().register(this); //register here or onStart, etc 
} 

private void startActivity2(){//Start activity2 without any extras 
    //Intent Activity2 
    //startActivity(Activity2) 
} 


@Subscribe 
public void eventFromActivity2(String fromActivity2){ 
//subscribe to an event to be posted by activity2 (e.g a String). 
//At this point Activity2 should be fully created to respond to events from Activity1 

    StudentEvent studentEventObject = new StudentEvent(
      etRegistrationNumber.getText().toString(), 
      etName.getText().toString(), 
      etCourse.getText().toString(), 
      etBranch.getText().toString()) ; 

     EventBus.getDefault().post(studentEventObject);//post event back to Activity2 

     EventBus.getDefault().unregister(this);//unregister 

} 

Activity2

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    EventBus.getDefault().register(this);//register here 

    // after completing onCreate, post event to Activity1 
    EventBus.getDefault().post("to Activity1"); 
} 

protected void onDestroy() { 

    EventBus.getDefault().unregister(this); //unregister here 
    super.onDestroy(); 
} 

@Subscribe 
public void eventReceiver(StudentEvent studentEvent){ //respond to event from Activity1 
    tvRegistrationNumber.setText(studentEvent.getRegistrationNumber()); 
    tvName.setText(studentEvent.getName()); 
    tvBranch.setText(studentEvent.getBranch()); 
    tvCourse.setText(studentEvent.getCourse()); 
} 

Auch sicher sein, von Ereignissen deregistrieren richtig

0

Sie sollten versuchen, @Subscribe(sticky = true) Anmerkung in "Activity 2" zu verwenden, und Aufruf bus.postSticky(...) Methode in "Aktivität 1".

Documentation