美文网首页
EventBus 的基本使用和源码解析

EventBus 的基本使用和源码解析

作者: plus彭于晏 | 来源:发表于2018-09-11 16:03 被阅读0次

    一开始只是在一些博客上闪过看到过EventBus,直到最近才使用到EventBus,感觉很好用,很简单,所以我决定来会会这位大哥,这里有:EventBus源码地址

    1.首先我们先来了解一下这个EventBus到底是什么?

        答:EventBus是一个Android事件发布和订阅的框架,通过解耦发布者和订阅者来简化Android事件传递。

    2.EventBus是干嘛用的?

    事件传递既可以用于Android四大组件间通信,也可以用于异步线程和主线程通信等,传统的事件传递方式有:Handler,接口回调,BroadcastReceiver,而EventBus就是 用来传递事件的,相对于传统的方式,它代码简洁,使用简单,并将事件发布和订阅充分解耦。

    那我们该怎么去使用它呢(基本用法)?

    例如在两个activity操作(FirstActivity,SecondActivity)

    添加依赖:

    //在app下的build.gradle中添加下面的依赖compile 'org.greenrobot:eventbus:3.0.0'

    (在FirstActivity)注册订阅事件:

    @Override

    protected   void    onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);

    }

    (在FirstActivity)取消注册订阅事件:

    @Override

    protected    void    onDestroy(){

        super.onDestroy();

        EventBus.getDefault().unregister(this);

    }

    (在SecondActivity)发布事件:

    EventBus.getDefault().post(Object obj);

    (在FirstActivity)订阅事件:

    @Subscribe(threadMode = ThreadMode.MAIN)

    public   void   onEvent(Object obj){

    //在这里进行逻辑操作

    }

    看吧,使用起来还是挺简单的,订阅者真正需要处理逻辑的就是在有注解@subscribe的方法onEvent(Object obj)中去按照我们自己的需求去处理,当然这里方法名不一定是onEvent了,我是受2.4版本影响,习惯了把方法名写成onEvent,在3.0版本中可以随意写,但是参数的class类型必须要跟发布者post的参数的class类型一致。

    线程模式:

    上面说过,只有使用注解@Subscribe(threadMode = ThreadMode.MAIN)标明的方法才是订阅者需要处理逻辑的地方。那这个threadMode是什么呢?它其实是指定订阅者处理事件的线程,EventBus总共有四种线程模式,分别是:

    ThreadMode.MAIN:(主线程)表示无论事件是在哪个线程发布出来的,该事件订阅方法onEvent都会在UI线程中执行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。

    ThreadMode.POSTING:表示事件发布在哪个线程,事件订阅函数onEvent(就会在那个线程执行,所以事件发布和订阅都是发生在同一个线程的,当指定这个线程模式的时候,在onEvent(()方法中不能执行耗时操作,如果执行耗时操作,容易导致事件分发延迟。

    ThreadMode.BACKGROUND(不管怎样都会在子线程里执行):表示如果事件在UI线程中发布出来的,那么订阅函数onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。

    ThreadMode.ASYNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。

    *******ASYNC相比前三者不同的地方是可以处理耗时的操作,其采用了线程池,且是一个异步执行的过程,即事件的订阅者可以立即得到执行。虽然BACKGROUND也采用了线程池,但它每次只能执行一个任务,就是不会异步执行。所以一般是更新UI的事件,就使用ThreadMode.MAIN,需要请求网络的事件就使用ThreadMode.AYSNC,。

    相关文章

      网友评论

          本文标题:EventBus 的基本使用和源码解析

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