什么是事件总线管理?

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

什么是EventBus?

  1. EventBus是发布/订阅的事件总线。EventBus模式-也被称为MessageBus或者发布者/订阅者(publisher/subcriber)模式——可以让两个组件相互通信,但是他们之间并不相互知晓。
  2. 基于事件总线管理/订阅/分发模式的。事件响应有更多的线程选择,EventBus可以向不同的线程中发布事件。EventBus支持Sticky Event。
  3. 使用时需要先注册订阅,然后向订阅者分发消息数据即可。包含4个成分:发布者,订阅者,事件,总线。订阅者可以订阅多个事件,发布者可以发布任何事件,发布者同时可以也是订阅者。分订阅、注册、发布、取消注册等步骤。

    如下图:

 EventBus.getDefault().register(this);   //注册事件
EventBus.getDefault().post(object); //发送事件
EventBus.getDefault().unregister(this); //取消事件

//订阅处理事件的方法和区别

//UI线程执行
public void onEventMainThread() {}
//当前发布事件的线程执行
public void onEventPostThread() {}
//如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列
public void onEventBackgroundThread() {}
//加入后台任务队列,使用线程池调用
public void onEventAsyncThread() {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

取消注册:

EventBus.getDefault().unregister(this);
  • 1

写个例子:单击一个按钮发送消息,事件在哪里注册了,就在哪里接收:

首先在build.gradle里加入一个依赖库:compile ‘org.greenrobot:eventbus:3.0.0’

package com.example.zhiwenyan.eventbus;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this); //注册事件
btn = (Button) findViewById(R.id.button);
textView = (TextView)findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyEvent myEvent = new MyEvent();
myEvent.setType("1");
myEvent.setContent("我是发送的内容");
//发送事件
EventBus.getDefault().post(myEvent);
}
});
} //处理事件
@Subscribe
public void onEventMainThread(MyEvent myEvent) {
if (myEvent.getType().equals("1")) {
textView.setText(myEvent.getContent());
}
} @Override
protected void onDestroy() {
super.onDestroy();
//取消注册
EventBus.getDefault().unregister(this);
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 2
  • 25

在OnCreate()里注册了一个事件 EventBus.getDefault().register(this);this代表在当前的类注册,单击一个按钮时发布一个事件EventBus.getDefault().post(myEvent); myEvent事件类的MyEvent的对象。然后在UI线程执行处理了这个事件;最后在onDestory摧毁了这个事件

事件类:

public class MyEvent {
private String type;
private String content; public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

布局文件就不复制了:一个Button、一个TextView很简单;

事件分发总库EventBus,小编正在学习这个,写一篇博客,帮助大家入门一下;小编认为学习这个,先把流程搞明白,然后在再去理解,多写几个例子(比如在Fragment之间传递信息,后台到前台传递消息等等),最后呢可以深入的研究一下里面的源码(正在研究中….);

大家也可以在github上去看一下:https://github.com/greenrobot/EventBus

事件总线EventBus的更多相关文章

  1. vue中央事件总线eventBus的简单理解和使用

    公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...

  2. Guava: 事件总线EventBus

    EventBus 直译过来就是事件总线,它使用发布订阅模式支持组件之间的通信,不需要显式地注册回调,比观察者模式更灵活,可用于替换Java中传统的事件监听模式,EventBus的作用就是解耦,它不是通 ...

  3. 【bird-java】分布式服务间的事件总线EventBus

    什么是EventBusEventBus是对发布-订阅模式的一种实现.其以一种非常优雅的方式实现了组件间的解耦与通信,在Android开发.DDD等领域都有非常广泛的应用. 事件流大致如下: Produ ...

  4. Android事件总线EventBus详解

    顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...

  5. 自己动手写事件总线(EventBus)

    本文由云+社区发表 事件总线核心逻辑的实现. EventBus的作用 Android中存在各种通信场景,如Activity之间的跳转,Activity与Fragment以及其他组件之间的交互,以及在某 ...

  6. C# 事件总线 EventBus

    1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需 ...

  7. ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现

    这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuge ...

  8. 事件总线 EventBus

    661. .net中事件模型很优雅的实现了观察者模式,同时被大量的使用在各种框架中. [2016-04-30 10:52:42]662. Prism框架中实现了一个典型的EventAggregator ...

  9. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

随机推荐

  1. HDU——2093考试排名(string类及其函数的运用以及istringstream)

    考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. BZOJ3325 [Scoi2013]密码 【manacher】

    题目 Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密码的长度 ...

  3. iOS-多线程(2)

    多线程之NSOperation: 多线程的优点: 使用线程可以把占据时间长的程序中的任务呀放到后台去处理 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显 ...

  4. linux监控平台搭建-磁盘

    linux监控平台搭建-磁盘 磁盘:随着大数据快速发展.人工智能.自动化.云平台.数据量指数的增长.磁盘的使用量也在增长.目前的机器基本上采用SSD或者SATA盘,一直有人比较那个好.会不会使用时间短 ...

  5. 移动web端使用rem实现自适应原理

    1.先获取到物理像素和实际像素的像素比 var pixclPatio = 1 / window.devicePixelRatio; 2.viewport视口设置为像素比大小 document.writ ...

  6. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  7. css3 boxing-sizing属性

    boxing-sizing: 1.content-box 计算宽度不包含padding和border宽度 2.border-box border和padding计算入width之内 3.padding ...

  8. 开发使用mysql的一些必备知识点整理(四)与python交互

    与python交互 在熟练使用sql语句的基础上,开始使用python语言提供的模块与mysql进行交互 这是我们在工作中大事要做的事 先学会sql是基础,一定要熟练编写sql语句 安装引入模块 安装 ...

  9. Codeforces Gym101502 H.Eyad and Math-换底公式

    H. Eyad and Math   time limit per test 2.0 s memory limit per test 256 MB input standard input outpu ...

  10. RabbitMQ 消费端限流、TTL、死信队列

    目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...