前言
最近在用EventBus
的进入了一个误区:只要页面注册过,重写对应的事件接收方法就都可以接收到。
发送事件页面都可以接收到的前提条件:
- 该页面注册过
EventBus.getDefault().register(this);
- 该页面没有被销毁
两种情况:
1.Activity执行过 onCreate() 方法;
2.Activity并未执行 onDestroy() 方法;
- 如果该页面执行过
onDestroy()
,但是并未取消注册
EventBus.getDefault().unregister(this);
分析
1. 页面没有执行onCreate();
- MainActivity:
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件
EventBus.getDefault().register(this);
findViewById(R.id.tv2).setOnClickListener(new OnClickListener() {
@Override
public void onClick (View view) {
Intent intent=new Intent(MainActivity.this,Test1Activity.class);
startActivity(intent);
}
});
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMoonEvent (MessageEvent messageEvent) {
Log.i(TAG, "onMoonEvent() messageEvent = " + messageEvent.getMessage());
}
@Override
protected void onDestroy () {
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(this);
}
- Test1Activity
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test1);
EventBus.getDefault().register(this);
findViewById(R.id.tv).setOnClickListener(new OnClickListener() {
@Override
public void onClick (View view) {
EventBus.getDefault().post(new MessageEvent("EventBusDemo"));
}
});
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
Log.i(TAG,"onMoonEvent() messageEvent = "+messageEvent.getMessage());
}
@Override
protected void onDestroy () {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
- Test2Activity
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test2);
EventBus.getDefault().register(this);
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
Log.i(TAG, "onMoonEvent() messageEvent = " + messageEvent.getMessage());
}
@Override
protected void onDestroy () {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
打印结果
小结
很显然,
Test2Activity
并没未收到回传事件,主要是因为它还没有执行onCreate()
方法,并未注册。
2. 页面没有在onDestroy()中取消注册;
- MainActivity
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件
EventBus.getDefault().register(this);
findViewById(R.id.tv2).setOnClickListener(new OnClickListener() {
@Override
public void onClick (View view) {
Intent intent=new Intent(MainActivity.this,Test1Activity.class);
startActivity(intent);
finish();
}
});
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMoonEvent (MessageEvent messageEvent) {
Log.i(TAG, "onMoonEvent() messageEvent = " + messageEvent.getMessage());
}
@Override
protected void onDestroy () {
super.onDestroy();
//取消注册事件
//EventBus.getDefault().unregister(this);
}
- Test1Activity与Test2Activity代码不变
打印结果
小结
MainActivity
销毁后,并未取消注册,当post
发送后依然能收到事件
。
3. 页面在onDestroy()中取消注册;
- MainActivity
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件
EventBus.getDefault().register(this);
findViewById(R.id.tv2).setOnClickListener(new OnClickListener() {
@Override
public void onClick (View view) {
Intent intent=new Intent(MainActivity.this,Test1Activity.class);
startActivity(intent);
finish();
}
});
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMoonEvent (MessageEvent messageEvent) {
Log.i(TAG, "onMoonEvent() messageEvent = " + messageEvent.getMessage());
}
@Override
protected void onDestroy () {
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(this);
}
- Test1Activity与Test2Activity代码不变
打印结果
小结
MainActivity
销毁后,取消注册,当post
发送后自然就收不到事件
。
最后,希望此篇博客对大家有所帮助,欢迎提出问题及建议共同探讨,如有兴趣可以关注我的博客,谢谢!