Android事件总线之EventBus3.0基本使用
2017-06-27 11:25
856 查看
前言
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。我们今天就来学习一下它。
1.EventBus概述
EventBus原理图
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/58988ef54b63c555d3defe90e23d3a52)
EventBus的四种ThreadMode(线程模型)
❶ ThreadMode.MAIN 表示这个方法在主(UI)线程中执行,不能做耗时操作,否则会ARN。
❷ ThreadMode.BACKGROUND 如果调用post方法的线程是子线程,则直接在该 线程执行,如果是主线程,则切换到后台执 行,不能做 并发处理。
❸ ThreadMode.ASYNC 无论消息在哪个线程发布,消息处理函数都会开辟新的独立线程,可以用来执行耗时操作。
❹ TheadMode.POSTING 消息处理函数与消息发送方在同一个线程执行。
2.下载地址:https://github.com/greenrobot/EventBus
2.EventBus的用法
1.自定义发送消息类
2.注册
3.发送消息
4.处理消息
处理事件方法名可以随意取名,但是必须加上@Subscribe,并指定线程模型
5.取消注册
3.EventBus实际应用
前面讲是EventBus的简介、原理和使用步骤,理论性比较强,接下来我们来写一个demo来实际应用一下吧
㈠ 首先添加依赖库
㈡创建消息事件类
㈢注册和取消
㈣ 消息处理
ThreadMode我这设置的是MAIN,事件会在UI线程中处理,这里用TextView显示事件传递的消息内容
㈤发布消息
代码写好了,让我们看一下运行结果。
我来看一下首页显示效果如图
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/06f6881233b5bdbc68981395159ec496)
点击“跳转到发送页面“按钮,进入发送消息页面,如图
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/907f35977b7633f3375b1064f2167c3a)
现在我们点击”主线程发送数据“按钮,当前页面被finish了,并返回到EventBus页面,EventBus页面显示了”主线程发送来的数据“
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/90bd4906e1a441c0bb0f939941a2d6d2)
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。我们今天就来学习一下它。
1.EventBus概述
EventBus原理图
EventBus的四种ThreadMode(线程模型)
❶ ThreadMode.MAIN 表示这个方法在主(UI)线程中执行,不能做耗时操作,否则会ARN。
❷ ThreadMode.BACKGROUND 如果调用post方法的线程是子线程,则直接在该 线程执行,如果是主线程,则切换到后台执 行,不能做 并发处理。
❸ ThreadMode.ASYNC 无论消息在哪个线程发布,消息处理函数都会开辟新的独立线程,可以用来执行耗时操作。
❹ TheadMode.POSTING 消息处理函数与消息发送方在同一个线程执行。
2.下载地址:https://github.com/greenrobot/EventBus
2.EventBus的用法
1.自定义发送消息类
public class MessageEvent { }
2.注册
EventBus.getDefault().register(EventBusActivity.this);
3.发送消息
EventBus.getDefault().register(EventBusSendActivity.this);
4.处理消息
@Subscribe(threadMode = ThreadMode.MAIN) public void messageEventBus(MessageEvent messageEvent) { tv_eventbus_result.setText(messageEvent.name); }
处理事件方法名可以随意取名,但是必须加上@Subscribe,并指定线程模型
5.取消注册
EventBus.getDefault().unregister(EventBusActivity.this);
3.EventBus实际应用
前面讲是EventBus的简介、原理和使用步骤,理论性比较强,接下来我们来写一个demo来实际应用一下吧
㈠ 首先添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
㈡创建消息事件类
/** * LiuW * Created by LiuW on 2017/6/27. */ //创建发送消息类 public class MessageEvent { public String name; public MessageEvent(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
㈢注册和取消
// eventbus
public class EventBusActivity extends Activity {
private TextView tv_title;
private Button bt_eventbus_send;
private Button bt_eventbus_sticky;
private TextView tv_eventbus_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
initView();
initData();
initListener();
}
private void initData() {
tv_title.setText("EventBus");
//注册
EventBus.getDefault().register(EventBusActivity.this);}
@Override
protected void onDestroy() {
super.onDestroy();
//解注册
EventBus.getDefault().unregister(EventBusActivity.this);
}
㈣ 消息处理
ThreadMode我这设置的是MAIN,事件会在UI线程中处理,这里用TextView显示事件传递的消息内容
@Subscribe(threadMode = ThreadMode.MAIN) public void messageEventBus(MessageEvent messageEvent) { tv_eventbus_result.setText(messageEvent.name); }
㈤发布消息
public class EventBusSendActivity extends Activity { private TextView tv_title; private Button bt_eventbus_send_main; private Button bt_eventbus_send_sticky; private TextView tv_eventbus_send_result; boolean isFirstFlag = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_bus_send); initView(); initData(); initListener(); } private void initListener() { // 主线程发送数据按钮点击事件处理 bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //发送消息 EventBus.getDefault().post(new MessageEvent("主线程发送来的数据")); // 结束当前页面 finish(); } }); }
代码写好了,让我们看一下运行结果。
我来看一下首页显示效果如图
点击“跳转到发送页面“按钮,进入发送消息页面,如图
现在我们点击”主线程发送数据“按钮,当前页面被finish了,并返回到EventBus页面,EventBus页面显示了”主线程发送来的数据“
相关文章推荐
- Android事件总线EventBus 3.0的基本使用
- Android事件总线框架之EventBus(3.0为例)
- (转)Android消息传递之EventBus 3.0使用详解
- Android消息传递之EventBus 3.0使用
- Android EventBus的基本使用
- Android消息传递之EventBus 3.0使用详解
- android EventBus 3.0使用指南
- Android消息传递之EventBus 3.0使用详解
- Android 框架学习1:EventBus 3.0 的特点与如何使用
- android EventBus 3.0 简单使用
- Android 框架学习1:EventBus 3.0 的特点与如何使用
- Android消息传递之EventBus 3.0使用详解
- Android消息传递之EventBus 3.0使用详解(转载)
- Android消息传递之EventBus 3.0使用详解(三)
- Android消息传递之EventBus 3.0使用详解
- android EventBus 3.0使用指南
- 事件总线分发库EventBus框架的简单使用
- Android消息传递之EventBus 3.0使用与案例
- android EventBus 3.0使用指南
- Android消息传递之EventBus 3.0使用详解