EventBus学习记录
Posted 劲火星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EventBus学习记录相关的知识,希望对你有一定的参考价值。
一、概念
什么是EventBus
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
简而言之,EventBus其实就是一个通信的中介EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。EventBus3.0跟先前版本的区别在于加入了annotation @Subscribe,取代了以前约定命名的方式。
二、事件
EventBus使用几种不同的事件来进行不同模块和不同进程之间的信息交换
-
ThreadMode.POSTING:默认的方式,在post方法的线程执行。
-
ThreadMode.MAIN: 在主线程执行
-
ThreadMode.BACKGROUND: 如果post方法不是主线程,直接在该线程执行,如果是主线程就切换到后台执行
-
ThreadMode.ASYNC: 开辟独立线程,内部使用来线程池,并发执行限制数量
三、使用
将其分成三步来执行(创建Message)(发送端代码)(接收端代码)
1、如下是Message类的创建,也就是一个基本的EventBus数据的传输单位
public class MessageEvent
public String name;
public MessageEvent(String name)
this.name = name;
2、如下是发送端的代码,通过post的方式来进行发送,发送端和接收端可以在不同的组件和不同的线程中
public class EventBusSendActivity extends Activity
private TextView tv_title;
private Button bt_eventbus_send_main;
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)
// 4 发送消息
EventBus.getDefault().post(new MessageEvent("主线程发送过来的数据"));
// 结束当前页面
finish();
);
// 3 接收粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void StickyEventBus(StickyEvent event)
// 显示接收的数据
tv_eventbus_send_result.setText(event.msg);
private void initData()
tv_title.setText("EventBus发送数据页面");
private void initView()
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send_main = (Button)findViewById(R.id.bt_eventbus_send_main);
bt_eventbus_send_sticky = (Button)findViewById(R.id.bt_eventbus_send_sticky);
tv_eventbus_send_result = (TextView)findViewById(R.id.tv_eventbus_send_result);
@Override
protected void onDestroy()
super.onDestroy();
// 5 解注册
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(EventBusSendActivity.this);
3、如下是接收端的代码,通过注解的方式来进行接收的,可以看到在进行接收之前都是要进行先注册的
public class EventBusActivity extends Activity
private TextView tv_title;
private Button bt_eventbus_send;
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 initListener()
// 跳转到发送页面
bt_eventbus_send.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
startActivity(intent);
);
private void initData()
tv_title.setText("EventBus");
//注册广播
EventBus.getDefault().register(EventBusActivity.this);
private void initView()
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send = (Button)findViewById(R.id.bt_eventbus_send);
tv_eventbus_result = (TextView)findViewById(R.id.tv_eventbus_result);
// 接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void MesssageEventBus(MessageEvent event)
// 显示接收的消息
tv_eventbus_result.setText(event.name);
@Override
protected void onDestroy()
super.onDestroy();
// 2 解注册
EventBus.getDefault().unregister(EventBusActivity.this);
另外还有一种粘性事件的方式,就是先进行接收然后再注册,什么时候注册什么时候接收,不注册就一直在内存中
四、原理
(一)注册原理
(1)因为注册实在接收端进行注册,所以接收端就是订阅者,而发送端就是发布者,发布者和订阅者之间是通过调度中心来尽心工作的,查找订阅者所有事件相应函数。
(2)循环每个事件相应函数,得到该事件的所有订阅者信息,将其插入订阅者的队列中
(二)发送原理
(1)也就是一个Post的流程,得到当前线程的post信息及队列
(2)将当前事件添加到当前线程的事件队列(3)循环事件队列中的每个事件
(4)找到对应事件的订阅者
尊重作者,尊重原创,参考文章:
http://www.jianshu.com/p/7007b07c05d6 与50位技术专家面对面 20年技术见证,附赠技术全景图
以上是关于EventBus学习记录的主要内容,如果未能解决你的问题,请参考以下文章