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

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

- [ Android EventBus源码解析 带你深入理解EventBus](http://blog.csdn.net/lmj623565791/article/details/40920453)

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

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

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

1c658c45e79f82ef2b8f365d7d171792.png

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

一.概念

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

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

cddfc3b809bad7052d25ae0c94aa552b.png

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

layout_main.xml

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">

android:id="@+id/btn_send"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="发送事件" />

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" />

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

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());

}

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

5497cf0fde9a797e6894e3428b62a3c7.gif

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值