EventBus3.0入门笔记

作者: Jcme丶Ls | 来源:发表于2016-10-27 10:39 被阅读269次

    前言

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

    因为网上很多基于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<FoodItem> foodListItems;
    
        public ListItemBus(List<FoodItem> foodListItems) {
            this.foodListItems = foodListItems;
        }
    
        public List<FoodItem> getFoodListItems() {
            return foodListItems;
        }
    
        public void setFoodListItems(List<FoodItem> 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入门笔记

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