我正在努力实现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
我错过了什么?
当我在同一个班级进行订阅时,它正在工作。
答案 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(...)
方法。
答案 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}}
祝你好运...!