简单的EventBus - 没有订阅者注册

时间:2016-04-17 05:15:47

标签: android event-bus greenrobot-eventbus-3.0

我正在努力实现EventBus Android for Android的绝对基本实现。

我正在尝试用户在activity 1中简单输入内容,然后使用eventbus将整个对象发布到下一个活动activity 2,而不是意图附加内容。 我完全遵循给定的准则:

  

第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;
  }
}
  

第2部分:第二项活动中的订阅

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());
}
  

第3部分:发布活动

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

 EventBus.getDefault().post(studentEventObject);

我收到错误:

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

我错过了什么?
当我在同一个班级进行订阅时,它正在工作。

6 个答案:

答案 0 :(得分:9)

这似乎是一个时间问题。必须注册活动2才能接收活动。如果您要从活动1发布活动,则无法保证已创建活动2。

答案 1 :(得分:8)

虽然这不是答案,但我认为这与EventBus用户有关。 Per EventBus documentation,我们需要在onStart()注册EventBus并注销onStop()

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

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

答案 2 :(得分:3)

您应该尝试在“活动2”中使用@Subscribe(sticky = true)注释,并在“活动1”中调用bus.postSticky(...)方法。

Documentation

答案 3 :(得分:1)

如果出现同样的问题,也许这可能会有所帮助。这是@JesseBuss所述的计时问题,因为Activity2必须完全创建并注册才能接收事件。但是,有一种方法可以确保将对象从Activity1传输到Activity2,但需要更多代码。为此,Activity2应订阅将由Activity1发布的活动,而Activity1也应订阅将由Activity2发布的活动。例如:

活性1

 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

}

活性2

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());
}

还要确保正确注销事件

答案 4 :(得分:0)

如果没有把EventBus.getDefault()。注册(这个);进入onCreate。 onEvent Lisneteners无法忍受火灾。

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);
    }

答案 5 :(得分:0)

您必须使用粘性事件,因为您正在发布StudentEvent,但由于尚未创建订户活动,因此尚未找到任何订户。如果您使用postSticky,则事件总线会将事件保留在内存中,并在以后发现订户时将其传递。

请参见以下示例:

第1部分:

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

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

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

第2部分:以即时贴方式订阅

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

 EventBus.getDefault().postSticky(studentEventObject);

第3部分:发布即时贴事件

{{1}}

祝你好运...!

相关问题