Android事件总线分发库EventBus的简单讲解与实践

导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了

  • Android EventBus源码解析 带你深入理解EventBus

我这里就简单的聊聊怎么去使用和实践了,在这里,要感谢一下开原作者,也就是《Android源码设计模式解析和实战》的作者何红辉

  • 地址:https://github.com/greenrobot/EventBus

EventBus已经更新到了3.0了,也优化得更多好了,推荐使用3.0及以上版本,这里先放上一张GitHub上的介绍图

好的,我们一步步来分析这张图

一.概念

既然是个库,我们首先要做的,肯定是引入他的依赖了

 compile 'org.greenrobot:eventbus:3.0.0'

如果是Eclipse,那就自行去Github上下载jar包添加到libs目录下

  • jar地址:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22

这里我们要明白一个概念,就是事件总线管理,明白了事件总线管理,你就知道这个库的妙用了,我们分三点来概述

  • 将事件放在队列里,用于管理和分发
  • 保证应用的各个部分之间高效的通信及数据,事件分发
  • 模块间的解耦

当然啦,这样说可能有点笼统,我们再来分析一下,关于事件总线,一共四个部分

  • 发布者
  • 订阅者
  • 事件
  • 总线

这也就迎合我们事件总线的思想了,订阅者可以订阅多个事件,发布者也可以发布任何事件,发布者同时也可以是订阅者,他的步骤

  • 订阅
  • 注册
  • 发布
  • 取消注册

现在是不是对EventBus有一个大概的轮廓啦?现在我们理解这张图就简单多了,发布者把事件发布到总线里面再进行分发

二.讲解

我们按照流程来

1.注册

 //注册 EventBus.getDefault().register(this);

一句话就注册,当然,他里面不光可以传上下文,还可以传类和事件订阅参数

2.取消注册

 @Override    protected void onDestroy() {        super.onDestroy();        //取消注册        EventBus.getDefault().unregister(this);    }

取消注册同样的,里面也可以和注册一样传递参数,我们后面详细说

3.发布

发布有两种

  • 直接发布
  • 滞留发布
 //直接发布,接收对象EventBus.getDefault().post("发布"); //滞留发布EventBus.getDefault().postSticky("滞留发布");

4.订阅处理数据

这也是他的一个优势的地方,在3.0之前的版本,我们是这样的

//主线程事件处理public void onEvent(MessageEvent event) {        log(event.message);    }//交互式线程事件处理public void onEventMainThread(MessageEvent event) {        textField.setText(event.message);    }//后台线程处理public void onEventBackgroundThread(MessageEvent event) {        saveToDisk(event.message);    }

3.0之后,我们看官方文档

  • http://greenrobot.org/files/eventbus/javadoc/3.0/

事件处理就需要这样使用了

   /* *UserEvent需要自己定义 */    //在ui线程执行     @Subscribe(threadMode = ThreadMode.MainThread)     public void onUserEvent(UserEvent event) {    }    //在后台线程执行    @Subscribe(threadMode = ThreadMode.BackgroundThread)     public void onUserEvent(UserEvent event) {    }    //强制在后台执行    @Subscribe(threadMode = ThreadMode.Async)     public void onUserEvent(UserEvent event) {    }    //默认方式, 在发送线程执行    @Subscribe(threadMode = ThreadMode.PostThread)     public void onUserEvent(UserEvent event) {    }

我们可以注解在方法名上面标记,Subscribe是订阅者的意识,我们定义一个threadMode ,四种模式

  • MainThread
  • BackgroundThread
  • Async
  • PostThread

大意就是这样,不知道大家理解了多少?总的来说,就是注册了之后,就可以,比如我这边发送一个消息数据,你那边就可以接收了

三,实践

我们直接来一个小例子吧,例子也是非常的简单,在一个地方发送一个数据消息事件,另一个地方去接收,这个应该不难,大家都知道做,我们新建一个工程——EventBus

我们首先注册,在把取消注册绑定在onDestroy()上,不多说,这里我们的主布局没什么东西,一个按钮点击发送,一个textview去接收

layout_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="15dp" android:gravity="center" android:orientation="vertical">    <Button  android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送事件" />    <TextView  android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textColor="@color/colorAccent" android:textSize="20sp" /></LinearLayout>

我们还需要一个实体类去保存数据

UserEvent

package com.lgl.eventbus;/** * 实体类 * Created by lgl on 2016/5/9. */public class UserEvent {    /** * 这里你传递什么类型你就写什么类型 */    //文本    private String text;    public String getText() {        return text;    }    public void setText(String text) {        this.text = text;    }}

接着,我们在Button的点击事件中去发送我们的自定义消息

@Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_send:                //发送自定义消息                UserEvent event = new UserEvent();                event.setText("我是萌哒哒的消息!");                EventBus.getDefault().post(event);                break;        }    }

然后我们在主线程汇总接收这个消息

    //主线程接收消息    @Subscribe(threadMode = ThreadMode.MAIN)    public void onUserEvent(UserEvent event) {        //如果多个消息,可在实体类中添加type区分消息        tv_content.setText(event.getText());    }

这样一个简单的事件订阅,接收就完成了,我们来看一下效果

这里我所讲的可能稍微简单点,但是EventBus真的是一个很容易上手,又强大的库,如果细心又爱专研的同学去github上看一下,也就大概的了解了一个思路,我作为一个老司机,也只是抛砖引玉了

Demo下载:http://download.csdn.net/detail/qq_26787115/9514941

我的群,通往Android的神奇之旅 :555974449,欢迎大家进来交流技术!

更多相关文章

  1. ScrollView 嵌套 RecyclerVeiw, 轻松解决滑动冲突
  2. 关于Android的Service
  3. Android(安卓)开发艺术探索之三 -- View 的事件体系
  4. Android(安卓)软键盘事件imeOptions响应
  5. Android(安卓)View框架总结(一)
  6. android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问
  7. 【新知提升】Android中的消息推送
  8. android 事件模型原理
  9. Android之高仿微信聊天的界面

随机推荐

  1. MYSQL简单的binlog恢复测试
  2. 如何从php中的数据库表创建表单下拉列表?
  3. 深入浅出MySQL读书笔记(一)
  4. MySQL搜索优化(用子查询替换长正则表达式)
  5. 阿里云服务器MySQL远程连接问题
  6. zabbix监控mysql、apache、交换机
  7. MySQL大战SQLite和PostgreSQL(比拼、比较
  8. MySQL中建立索引的集中方式
  9. 关于MySQL的各种总结
  10. mysql 调优 来自5.6版本官方手册