EventBus3.0入门笔记

前言

网上有很多教程,为什么还需要写一次?

因为网上很多基于2.4的,鉴于3.0跟2.4差别还是很大,另外教程有点乱,所以重写一篇,方便大家(百度没收录因为不支持github pager,所以只方便谷歌的。。。)也方便自己。

What

EventBus是什么?

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

另外EventBus其实是一类框架的总称,只不过由于greenrobot做的很优秀,所以大家说起EventBus的时候一般指的是greenrobot的EventBus,greenrobot应该不会陌生吧,GreenDAO就出自他们之手。

why

为什么要用EventBus?

使用一款第三方库的原因不外乎因为第三方库封装的好,使用方便,运行效率高。原本EventBus3.0的效率就比EventBus2.4、Otto的效率高,配合eventbus-annotation-processor的话更是在原来EventBus3.0的基础上效率高上一倍。
另外,假设我们的app需要在启动时进行网络请求,可是网络有延时,页面加载完成之后再更新UI的话会造成页面闪动,用户体验十分不好,所以我们一般会加一个启动页面,在这时候进行数据加载、网络请求等。当请求结束,得到数据之后跳转到主页面了,我们怎么把数据传递过去?Sticky Broadcast确实可以不过重量级了。所以我们需要有一个轻量级的解决方案。EventyBus就是这么一个轻量级的框架!

How

EventBus怎么用

添加依赖

dependencies {
        ......
        compile 'org.greenrobot:eventbus:3.0.0'
        provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
    }

当然也可以直接在AS里查找,只需要输入EventBus就可以找到了。


image

注册

当我们想使用EventBus去接收消息或者说订阅消息之前,我们必须对其进行注册。通常写在onCreate里:

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
        ......
    }

注销

事物都是两面的,有注册就会有注销,注销写在onDestroy里:

  public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        ......
    }

发布

假设我们在网络通讯中获取到了数据,由于是异步处理,所以不能直接return,我们需要通过一个媒介把消息传递出去,EventBus开过来了。使用非常简单,只需要在想要发布消息的地方加上那么一句话:

EventBus.getDefault().post(new ListItemBus(list));

其中消息一般为我们自己建的bean,如:

public class ListItemBus {
    private List foodListItems;

    public ListItemBus(List foodListItems) {
        this.foodListItems = foodListItems;
    }

    public List getFoodListItems() {
        return foodListItems;
    }

    public void setFoodListItems(List foodListItems) {
        this.foodListItems = foodListItems;
    }
}

订阅

订阅也十分方便,在已注册的activity或者fragment中,新建方法如下(方法名可以随便取):

 @Subscribe(threadMode = ThreadMode.MAIN)
    public void ListEvent(ListItemBus listItemBus) {
       ......
    }

EventBus是根据消息类来区分订阅者的,所以想不同的订阅者接收不同的消息需要不同的消息类,如上面的ListItemBus,我们可以把他改成String,当然发布放那边传的也要是String才行。

@Subscribe注解

在Subscribe注解中,我们可以定义接收到消息之后的运行方式,优先级等。

threadMode

定义执行线程,提供了4个方法:

  1. MAIN : 在UI线程中运行可以用于修改UI
  2. BACKGROUND :若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
  3. ASYNC :加入后台任务队列,使用线程池调用,一般用于网络请求
  4. POSTING :默认模式,会在发布的线程执行

priority

定义优先级,默认为0,数值越大,优先级越高:

    @Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
    public void ListEvent(ListItemBus listItemBus) {
    ......
    }

sticky

文章开头的时候我说过,在启动页加载数据然后传递过去,可是假设启动画面需要持续3秒,而我数据1秒加载完了,这时候传递过去,由于订阅者还没有初始化,所以接收不到消息,这时候我们就需要使用到sticky了。使用方法同样很简单,只需要在想发布的地方把post换成postSticky:

EventBus.getDefault().postSticky(new ListItemBus(list));

订阅者那端也很方便,在@Subscribe注解中加入sticky = true即可。

  @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void ListEvent(ListItemBus listItemBus) {
       ......
    }

后记

我Boss说过一句话,我们不单要会用,还要知道他为什么这样用,这时候,我们就需要涉及源码了,我看到一篇挺好的EventBus3.0源码解析,大家可以看一下EventBus 3.0进阶:源码及其设计模式 完全解析。

你可能感兴趣的:(EventBus3.0入门笔记)