EventBus的总结

EventBus作为一个相当流行的开源框架,作为一个合格的开发人员,我们应该去了解,并且使用这些比较好用的开源框架,一来是为了减轻我们的工作量,二来呢?也是使我们的项目更加简洁,耦合度更低,因为我们开发新功能的时候,非常的讲究高内聚低耦合的这种模式,因此EventBus的出现,就能很好的降低代码之间的耦合度.

EventBus是什么?

官方定义:是一个发布 / 订阅的事件总线。
说白了,也就是类似于广播这种功能,就是进行数据传递的时候使用的.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.而且它的开销更加的小,代码的耦合度更低,因此,我们有必要来了解一下这个开源框架.

EventBus的基本使用

配置环境:
我们使用jar包的时候,第一个就是需要把这个jar包引入你的工程,这对于一般的开发人员应该都不是什么难事,提供一个EventBus开源框架的链接:
源码:https://github.com/greenrobot/EventBus

  1. 首先我们定义一个类,这个类可以是空的也可以传递一些参数:
public class EventFirst {
    private String message;

    public EventFirst(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  1. 既然是发布/订阅事件,那么我们需要有订阅事件吧!
public class SubscibeActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //注册EventBus
        EventBus.getDefault().register(this);
    }
//在这个方法中执行你要做的事情
    public void onEvent(EventFirst event) {
    //从event中获取你需要的参数
        Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除注册
        EventBus.getDefault().unregister(this);
    }
}
  1. 订阅事件是不是很简单呢?现在订阅事件已经有了,我们需要发布事件,因为如果没有东西需要发布,上面写的一堆都是然并卵呀!
 Button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            //发布事件
                EventBus.getDefault().post(new  EventFirst("第一个EventBus"));
            }
        });

擦亮你的眼睛,对你没有看错,就是这么一句话!这就是发布事件,不需要其他多余的代码!是不是用起来特别的简单呢?

现在,你的心里肯定会有特别多的疑问,为什么onEvent的方法可以自动执行?为什么post的方法可以发布?为什么…为什么….
其实,如果我们查看EventBus的源码就可以知道,这一切的疑问就会迎刃而解.EventBus其实本身就是一个单例模式,对于单例模式我觉得大家可能并不陌生.register(this)就是去当前类,遍历所有的方法,找到onEvent开头的然后存储到一个map集合里,键就是class的类型。unregister(this)肯定就是结束遍历的标志了.在遍历完所有的类之后,这个map集合就存储了很多onEvent开头的方法,在post的时候,他就会根据类型进行匹配哦,然后匹配成功之后,就根据反射进行执行.

使用EventBus遇到的坑

我不得不说,EventBus确实非常好用,最起码要比广播之类的好用的多,代码简洁,使用简单,基本上看上两遍就会用了,但是他也有不好的地方,比如代码出现问题的时候,你想debug,oh no我劝你最好不要这样做,因为你根本不知道自己到底debug到哪里去了,问题就变得不那么好定位.还有,我们项目开发的过程也遇到这么神奇的事情,就是你提交了一个评论,但是,出来的是两条一模一样的!!!真的是见鬼了….后来追查原因才发现,原来是Fragment和EventBus同时使用的时候,当前一个Fragment没有被回收掉,而Fragment又重新创建的时候,onEvent的方法执行了两次!!!所以,使用还需谨慎…..

EventBus其他的方法
  1. onEvent :哪个线程发布就在哪个线程执行
    如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

  2. onEventMainThread:总是在主线程中执行
    如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

  3. onEventBackground:在子线程中执行
    如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

  4. onEventAsync:总是创建显得子线程执行
    使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值