Android EventBus误区分析

2018-08-23  本文已影响0人  会撒娇的犀犀利

前言

最近在用EventBus的进入了一个误区:只要页面注册过,重写对应的事件接收方法就都可以接收到。

发送事件页面都可以接收到的前提条件:

  1. 该页面注册过
 EventBus.getDefault().register(this);
  1. 该页面没有被销毁

两种情况:

1.Activity执行过 onCreate() 方法;
2.Activity并未执行 onDestroy() 方法;
  1. 如果该页面执行过onDestroy() ,但是并未取消注册
 EventBus.getDefault().unregister(this);

分析

1. 页面没有执行onCreate();
@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);
}
 @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);
    }
 @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);
    }
打印结果
不执行OnCreate()
小结

很显然,Test2Activity并没未收到回传事件,主要是因为它还没有执行onCreate()方法,并未注册。

2. 页面没有在onDestroy()中取消注册;
@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);
}
打印结果
未取消注册
小结

MainActivity销毁后,并未取消注册,当post发送后依然能收到事件

3. 页面在onDestroy()中取消注册;
@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);
}
打印结果
取消注册
小结

MainActivity销毁后,取消注册,当post发送后自然就收不到事件

最后,希望此篇博客对大家有所帮助,欢迎提出问题及建议共同探讨,如有兴趣可以关注我的博客,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读