Android事件总线设计(一)- EventBus初步学习
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初步学习相关推荐
- Android事件总线(一)EventBus3.0用法全解析
相关文章 Android事件总线(一)EventBus3.0用法全解析 Android事件总线(二)EventBus3.0源码解析 Android事件总线(三)otto用法全解析 Android事件总 ...
- Android退出程序(三)——Android事件总线
概述 当我们跟随时间的脚步向前挪动的时候,总能发现原来以前的自己做了一些愚蠢的事情.但,不见得以前就是不好的事情.我在以前的博客中写过两种关于Android中如何退出应用程序的方法.近日,我又发现了一 ...
- Android自定义事件总线,手写Android事件总线框架Eventbus(简易版)
开篇废话 近期利用业余时间,跟着大神把Eventbus的框架学习了一下,在这里,记录一下这次学习的心得. EventBus是针一款对Android的发布/订阅事件总线.它可以让我们很轻松的实现在And ...
- Android事件总线 ( AndroidEventBus ) 框架学习
来自:http://blog.csdn.net/bboyfeiyu/article/details/43450553 AndroidEventBus 如果你不知道事件总线是什么,那么没有关系,下面我 ...
- Android事件总线——EventBus的使用
前言 首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信. 什么是Eve ...
- Android 事件总线 EventBus入门及使用
何为事件总线? 是对发布-订阅模式的一种实现. 它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的.学习它之前最好先了解下观察者模式 说白了就是不同组件间 ...
- Android事件总线 EventBus3.0用法学习
http://blog.csdn.net/itachi85/article/details/52205464 1.EventBus的三要素 Event:事件,可以是任意类型的对象. Subscribe ...
- Android事件总线还能怎么玩?
作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...
- Android事件总线 ( AndroidEventBus ) 开源库发布
AndroidEventBus 如果你不知道事件总线是什么,那么没有关系,下面我们先来看这么一个场景: 你是否在开发的过程中遇到过想在Activity-B中回调Activity-A中的某个函数,但Ac ...
最新文章
- bmaplib vue 调用_Vue-cli3/4中使用AMap、BMap
- 阿里centos7 yum源
- ES6一些新特性记录
- CookiePolicy 原理解析
- charles 如何抓取web界面的包
- linux系统如何启用ftp服务
- oracle不属于集合操作,Oracle的几个集合操作
- java 获取年 两位,java使用jxl读取日期年份只显示前两位的解决方法
- python 操作符 vs java 操作符
- SharePoint 2007有性能问题? 先试试这篇.
- 自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块,ST和梯形图双语言
- C/C++ 各种进制的表示方法/ 进制前缀
- ASP.NET中防止刷新页面造成表单重复提交
- ubuntu系统安装TeamViwer远程控制软件
- 当前版本与卡刷包android_安卓SuperSU卡刷包 V2.82 SR5 安卓版下载 - win10专业版官网 - win10系统之家...
- 拼接大屏数据展示_4K高清拼接屏大数据点对点显示解决方案
- gif转换成jpg,这个方法很简单
- 三角形中重心、内心、外心、垂心向量计算公式
- 李博轩担任摄影作品有哪些?
- OCMJ8X15B金鹏液晶屏驱动程序+字库规律