Android事件总线——EventBus的使用
来源:互联网 发布:淘宝怎么申请天猫店铺 编辑:程序博客网 时间:2024/06/06 19:06
前言
首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信。
什么是EventBus
EventBus 是一款针对Android优化的发布-订阅事件总线,简化了应用程序中的各个组件与后台线程间的通信。
其优点是开销小,代码更优雅,将发送者和接收者解耦。
EventBus的使用
EventBus三要素
- Event:事件。(任意类型)
- Subscriber:事件订阅者。在EventBus3.0之前仅限定于4种线程模型(onEvent,onEventMainThread,onEventBackgroundThread和onEventAysnc)。而在EventBus3.0之后,事件处理方法任意命名,但必须添加一个注解@Subscribe,并指定线程模型(默认为POSTING)。
- Publisher:事件发布者。调用EventBus的post(Object)。根据post参数类型,自动调用相应事件的函数。
EventBus4种ThreadMode(线程模型)
- POSTING(默认):发布事件和接收事件在同一个线程。在使用该线程模型事件处理函数中尽量避免执行耗时操作,会导致线程阻塞,甚至引发ANR异常。
- MAIN:处理事件在UI线程执行。事件处理的事件不能太长,太长会导致ANR。
- BACKGROUND:如果事件在UI线程发布,则该事件函数处理在新的线程中运行;如果事件在子线程发布,则事件函数处理直接在发布线程中运行。此事件处理函数禁止更行UI操作。
- ASYNC:无论事件在哪个线程发布,该事件函数处理都会在新建的子线程中执行。同样,该事件处理函数禁止更行UI操作。
EventBus的基本用法
(1) 自定义一个事件类
public class MessageEvent{ ...}
(2)在需要订阅该事件的地方注册事件
EventBus.getDefault().register(this);
(3)发送事件
EventBus.getDefault().post(messageEvent);
(4)处理事件
@Subscribe(threadMode = ThreadMode.MAIN)public void XXX(MessageEvent messageEvent){ ...}
(5)取消注册事件
EventBus.getDefault().unregister(this);
代码示例
(1)添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
(2)定义消息事件类
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; }}
(3)注册和取消订阅事件
public class MainActivity extends AppCompatActivity { private TextView tv_message; private Button btn_subscription, btn_message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_message = (TextView) findViewById(R.id.tv_message); tv_message.setText("MainActivity"); btn_subscription = (Button) findViewById(R.id.btn_subscription); btn_subscription.setText("注册事件"); btn_message = (Button) findViewById(R.id.btn_message); btn_message.setText("跳转到SecondActivity"); btn_subscription.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //注册事件 EventBus.getDefault().register(MainActivity.this); } }); btn_message.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }); } @Override protected void onDestroy() { super.onDestroy(); //取消注册事件 EventBus.getDefault().unregister(MainActivity.class); }}
(4)事件订阅者处理事件
在MainActivity中自定义方法来处理事件。
@Subscribe(threadMode = ThreadMode.MAIN) public void onMoonEvent(MessageEvent messageBean) { //展示收到的消息 tv_message.setText(messageBean.getMessage()); }
(5)事件发布者发布事件
创建SecondActivity发布消息。
public class SecondActivity extends AppCompatActivity { private TextView tv_message; private Button btn_message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); tv_message = (TextView) findViewById(R.id.tv_message); tv_message.setText("SecondActivity"); btn_message = (Button) findViewById(R.id.btn_message); btn_message.setText("发送事件"); btn_message.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEvent("欢迎学习EventBus")); finish(); } }); }}
运行程序如下,当我们点击MainActivity中的“注册事件”按钮来注册事件,然后点击“跳转到SECONDACTIVITY”按钮,跳转到SecondActivity。接下来我们点击“发送事件”,这时候finishSecondActivity,显示MainActivity,TextView显示“欢迎学习EventBus”。这样MainActivity成功的接收到了SecondActivity中发送的事件。如图:
EventBus的黏性事件
EventBus黏性事件,就是发送该事件之后再订阅该事件也能收到该事件。修改代码如下:
(1)订阅者处理黏性事件
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true) public void onMoonStickyEvent(MessageEvent messageEvent){ tv_message.setText(messageEvent.getMessage()); }
(2)发送黏性事件
在SecondActivity中定义Button发送黏性事件。
btn_subscription.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().postSticky(new MessageEvent("黏性事件")); finish(); } });
现在我们运行程序,在我们的MainActivity中没有点击“注册事件”,直接跳转到SecondActivity中发送黏性事件。这时回到我们的MainActivity界面。
————————————>
接下来我们点击注册事件,你会发现TextView发生改变显示“粘性事件”,这时大功告成。
ProGuard 混淆规则
-keepattributes *Annotation*-keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>;}-keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable);}
总结
欢迎童鞋们学习EventBus的基本使用。
更多请查看:
EventBus的github地址:https://github.com/greenrobot/EventBus
EventBus官网:http://greenrobot.org/eventbus/
- Android事件总线——EventBus的使用
- 事件总线EventBus Android开源库的使用
- 事件总线-EVENTBUS的使用
- EventBus事件总线的使用
- EventBus事件总线的使用
- Android事件总线EventBus 3.0的基本使用
- Android事件总线EventBus 3.0的基本使用
- [Android] EventBus事件总线
- Android 事件总线EventBus
- Android EventBus事件总线
- 事件总线---EventBus使用
- Android事件总线纷发库EventBus的使用方法
- Android事件总线EventBus的用法详解
- 事件总线分发库EventBus的使用
- 关于事件总线EventBus的使用
- EventBus事件总线,eventvus的使用
- 事件总线分发库--EventBus的使用
- EventBus事件总线框架的使用
- java bean
- 学生信息管理系统之ASCII问题汇总
- Windows系统用得好好的,为什么要换成国产操作系统?
- 10个屌炸天的设计网址导航带你嗨翻科技设计界
- 如何用自己电脑为Android搭建一个局域网服务器
- Android事件总线——EventBus的使用
- Oracle 的 SQL语句中如何处理‘&’等特殊符号
- ajax接收后台传来的JSON类型数据,可通过循环遍历为input赋值(input的ID需要和返回来的数据名相同)
- 仿美团炫酷动画效果的A-Z字母排序侧边库1
- coursera《机器学习》吴恩达-week2-01 多个变量的线性回归
- 用Java编写CGI小结
- poj 2186 Popular Cows 强连通分量
- 大整数的四则运算
- 2.串口通信的基本概念