美文网首页
Android EventBus误区分析

Android EventBus误区分析

作者: 会撒娇的犀犀利 | 来源:发表于2018-08-23 18:57 被阅读0次

前言

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

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

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

两种情况:

1.Activity执行过 onCreate() 方法;
2.Activity并未执行 onDestroy() 方法;
  1. 如果该页面执行过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);
    }
打印结果
不执行OnCreate()
小结

很显然,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发送后自然就收不到事件

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

相关文章

  • Android EventBus误区分析

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

  • 拆轮子系列——EventBus 源码解析

    项目地址:EventBus,本文分析版本: 3.1.1 一、概述 EventBus 是一个 Android 事件发...

  • Android EventBus源码解析

    在《Android EventBus使用》博文中,我们已经对EventBus的使用进行了分析,在这篇博文中,我们就...

  • EventBus 源码分析

    本篇文章是EventBus的源码分析,以了解其实现的精髓`。EventBus是针对Android优化的发布-订阅事...

  • EventBus源码分析(一)

    EventBus源码分析(一) EventBus官方介绍为一个为Android系统优化的事件订阅总线,它不仅可以很...

  • EventBus 使用及原理

    转自Android面试之EventBus原理分析[https://zhuanlan.zhihu.com/p/778...

  • EventBus

    EventBus 3.0原理分析 HermesEventBus-饿了么开源的Android跨进程事件分发框架

  • EventBus源码分析

    EventBus源码分析 Android开发中我们最常用到的可以说就是EventBus了,今天我们来深入研究一下E...

  • 观察者模式(触发联动)

    0、提纲 目录:1、举例:发起登录请求2、Android Adapter 相关源代码分析3、EventBus 相关...

  • EventBus源码分析(二)

    EventBus源码分析(二) 在之前的一篇文章EventBus源码分析(一)分析了EventBus关于注册注销以...

网友评论

      本文标题:Android EventBus误区分析

      本文链接:https://www.haomeiwen.com/subject/kaimiftx.html