Android事件总线设计(一)

我们通常在进行安卓设计的时候,不同的Activity,Fragment,Service等之间通讯一直是个不小的问题,用Intent以及Handler都觉得有一点麻烦,于是,为了简化以及更加高质量的完成通信,同时解决组件之间高耦合的前提下仍能高效的进行通信,事件总线设计出现了,提到事件总线,我们就会想到EventBus以及otto,这篇博客我们就先来讲解一下EventBus的用法;


初识EventBus

EventBus是一款针对Android优化的发布-订阅事件总线,它简化了应用程序内各组件之间以及组件与后台线程之间的通讯,开销小,代码看着更舒服一点。对于Activity之间的通讯,我们一般采用Intent的方法,对于Fragment与Activity之间的通讯,基本上就需要使用接口了,而Fragment之间的通讯,我们一般会采用广播,简单来说,这个通讯就是越来越麻烦的,而且效率也很低,那接下来我们就开始正式介绍一下这个EventBus。


EventBus的三要素

在学会使用之前,首先要理解一下这个本质上来说是个什么东西以及他的基本规则,刚才我们说过,EventBus的一种发布-订阅事件总线,那么基本上就可以知道三要素是什么了:

1.事件:Event,可以是任意类型的对象;

2.事件发布者:Publisher,可以在任意线程任意位置发送事件,直接调用EventBus的post()方法,一般直接使用EventBus.getDefault()进行调用,根据post函数参数的类型,会自动调用订阅相应类型事件的函数;

3.事件订阅者:Subscriber,在使用时需要添加@Subscriber,并且要指定线程模型,默认为POSTING,马上我们就会讲到EventBus的线程模型。


EventBus的四种线程模型

1.POSTING(默认):这个事件在哪个线程发出来的,就会在哪个线程执行,发布事件和接收事件是在同一个线程,尽量避免执行耗时操作,会阻塞时间的传递;

2.MAIN:这个事件的处理会在UI线程中执行,同样事件处理时间不能太长;

3.BACKGROUND:这个事件处理要看是什么线程发出的了,UI线程发出,那就会新开个线程处理,子线程发出,那就直接在子线程处理,因此禁止进行UI更新操作;

4.ASYNC:这个事件处理就不管是什么线程发布的了,直接新开线程,同样禁止进行UI更新操作。


EventBus的基本使用

首先定义一个事件类

我们选择定义一个事件类MessageEvent,来进行消息的传递:

public class MessageEvent {private String message;public MessageEvent(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

定义完成,我们可以看到这也就是相当于是定义了一个String变量的收发。


第二注册事件

在需要订阅事件的地方进行事件的注册,基本语句就下面这句:

EventBus.getDefault().register(this);

第三发送事件

在发送事件的地方直接输入下面的代码即可:

EventBus.getDefault().post(messageEvent);

第四处理事件

事件发送过来后我们需要对发过来的信息进行接收处理:

@Subscribe(threadMode = ThreadMode.MAIN)
public void ReturnMessage(MessageEvent MessageEvent){***
}

第五取消事件订阅

在onDestroy()方法中进行EventBus的订阅取消:

EventBus.getDefault().unregister(this);

基本就是这样了,接下来我们来实际应用一遍加深印象:


EventBus实际应用进行通讯

我们就使用Activity之间的通讯作为例子,所有的大体上都是一样的:


配置消息事件类

public class MessageEvent {private String message;public MessageEvent(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

和之前的一样,没啥好说的;


新建两个Activity同时进行布局

第一个布局需要一个textView两个Button:

第二个布局只需要一个Button:


第一个Activity进行事件的订阅处理以及取消订阅

public class NoticeActivity extends AppCompatActivity implements View.OnClickListener {private TextView testView;private Button eventBusRegister, jumpActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_notice);initView();eventBusRegister.setOnClickListener(this);jumpActivity.setOnClickListener(this);}public void initView() {testView = findViewById(R.id.testView);eventBusRegister = findViewById(R.id.eventBusRegister);jumpActivity = findViewById(R.id.jumpActivity);}@Overridepublic void onClick(View v) {switch (v.getId()) {//点击注册EventBuscase R.id.eventBusRegister:EventBus.getDefault().register(NoticeActivity.this);break;case R.id.jumpActivity:startActivity(new Intent(NoticeActivity.this, ReturnActivity.class));break;}}//进行事件处理@Subscribe(threadMode= ThreadMode.MAIN)public void returnMessageEvent(MessageEvent messageEvent){testView.setText(messageEvent.getMessage());}@Overrideprotected void onDestroy() {super.onDestroy();//进行事件取消订阅EventBus.getDefault().unregister(this);}
}

注释里面都写了,接下来看第二个:


第二个Activity中进行事件的发送

public class ReturnActivity extends AppCompatActivity implements View.OnClickListener {private Button finishWithNotice;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_return);initView();finishWithNotice.setOnClickListener(this);}public void initView() {finishWithNotice = findViewById(R.id.finishWithNotice);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.finishWithNotice:EventBus.getDefault().post(new MessageEvent("EventBus King"));finish();}}
}

这个finish的意思就是处理完成后自动关闭这个Activity。


我们来看一下实际效果:

我们可以很明显的看到了,在注册EventBus之后,在第二个Activity中进行事件发送后,在第一个Activity中可以完美接收到这个消息,没有问题。

不过还存在一个事情,就像我一开始点击的那样,我先进行事件发送,再进行事件订阅,我们也想要接收到这个事件,应该怎么做呢,这就涉及到EventBus的黏性事件问题:


EventBus黏性事件

上面的属于普通事件,黏性事件其实也就是,在发送事件之后再订阅该事件,那么也能收到该事件,其实很简单,我们修改一下之前的部分代码:

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)public void returnMessageEvent(MessageEvent messageEvent) {testView.setText(messageEvent.getMessage());}
public void onClick(View v) {switch(v.getId()){case R.id.finishWithNotice:EventBus.getDefault().postSticky(new MessageEvent("EventBus King"));finish();}}

就这两部分,一个是处理,一个是发送,来看一下效果:

成功,就这样吧,下次再看看别的。

Android事件总线设计(一)- EventBus初步学习相关推荐

  1. Android事件总线(一)EventBus3.0用法全解析

    相关文章 Android事件总线(一)EventBus3.0用法全解析 Android事件总线(二)EventBus3.0源码解析 Android事件总线(三)otto用法全解析 Android事件总 ...

  2. Android退出程序(三)——Android事件总线

    概述 当我们跟随时间的脚步向前挪动的时候,总能发现原来以前的自己做了一些愚蠢的事情.但,不见得以前就是不好的事情.我在以前的博客中写过两种关于Android中如何退出应用程序的方法.近日,我又发现了一 ...

  3. Android自定义事件总线,手写Android事件总线框架Eventbus(简易版)

    开篇废话 近期利用业余时间,跟着大神把Eventbus的框架学习了一下,在这里,记录一下这次学习的心得. EventBus是针一款对Android的发布/订阅事件总线.它可以让我们很轻松的实现在And ...

  4. Android事件总线 ( AndroidEventBus ) 框架学习

    来自:http://blog.csdn.net/bboyfeiyu/article/details/43450553  AndroidEventBus 如果你不知道事件总线是什么,那么没有关系,下面我 ...

  5. Android事件总线——EventBus的使用

    前言 首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信. 什么是Eve ...

  6. Android 事件总线 EventBus入门及使用

    何为事件总线? 是对发布-订阅模式的一种实现. 它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的.学习它之前最好先了解下观察者模式 说白了就是不同组件间 ...

  7. Android事件总线 EventBus3.0用法学习

    http://blog.csdn.net/itachi85/article/details/52205464 1.EventBus的三要素 Event:事件,可以是任意类型的对象. Subscribe ...

  8. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

  9. Android事件总线 ( AndroidEventBus ) 开源库发布

    AndroidEventBus 如果你不知道事件总线是什么,那么没有关系,下面我们先来看这么一个场景: 你是否在开发的过程中遇到过想在Activity-B中回调Activity-A中的某个函数,但Ac ...

最新文章

  1. bmaplib vue 调用_Vue-cli3/4中使用AMap、BMap
  2. 阿里centos7 yum源
  3. ES6一些新特性记录
  4. CookiePolicy 原理解析
  5. charles 如何抓取web界面的包
  6. linux系统如何启用ftp服务
  7. oracle不属于集合操作,Oracle的几个集合操作
  8. java 获取年 两位,java使用jxl读取日期年份只显示前两位的解决方法
  9. python 操作符 vs java 操作符
  10. SharePoint 2007有性能问题? 先试试这篇.
  11. 自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块,ST和梯形图双语言
  12. C/C++ 各种进制的表示方法/ 进制前缀
  13. ASP.NET中防止刷新页面造成表单重复提交
  14. ubuntu系统安装TeamViwer远程控制软件
  15. 当前版本与卡刷包android_安卓SuperSU卡刷包 V2.82 SR5 安卓版下载 - win10专业版官网 - win10系统之家...
  16. 拼接大屏数据展示_4K高清拼接屏大数据点对点显示解决方案
  17. gif转换成jpg,这个方法很简单
  18. 三角形中重心、内心、外心、垂心向量计算公式
  19. 李博轩担任摄影作品有哪些?
  20. OCMJ8X15B金鹏液晶屏驱动程序+字库规律

热门文章

  1. 信息泄露,那些央视没报的“内鬼
  2. 【nacos】springboot @Value @NacosValue 使用时可能无效
  3. Win10-更改c盘下的用户文件夹名[转]
  4. 联邦学习开源框架简介
  5. spring的actuator健康监测配置
  6. termux无法安装引导程序包_分享一个小玩意儿Termux
  7. 手机如何当win10电脑摄像头使用
  8. win10 CMD大全
  9. 《只为遇见你》硬生生把爱情片拍成了把妹宝典,真人出镜演绎直男转型
  10. Java以毫秒为单位返回秒表记录的流逝时间(即求一个程序段的运行时间)