EventBus学习记录
来源:互联网 发布:淘宝肉妈护肤品扒皮 编辑:程序博客网 时间:2024/05/22 05:25
一、概念
什么是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数据的传输单位
2、如下是发送端的代码,通过post的方式来进行发送,发送端和接收端可以在不同的组件和不同的线程中public class MessageEvent { public String name; public MessageEvent(String name) { this.name = name; }}
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
阅读全文
1 0
- 学习EventBus的记录
- EventBus学习记录
- EventBus学习记录
- EventBus学习记录(1):EventBus初步
- EventBus学习
- EventBus学习
- EventBus 学习
- eventBus学习
- EventBus学习
- EventBus学习
- EventBus使用记录
- EventBus使用记录(一)
- EventBus学习笔记-什么是EventBus
- 项目中使用EventBus----记录
- Guava学习笔记:EventBus
- Guava学习笔记:EventBus
- Guava学习笔记:EventBus
- Android EventBus学习总结
- i2c-tools 测试i2c
- wget下载一个目录
- 测试一个进程的运行时间
- poj 3254
- Kotlin学习(一)——环境搭建
- EventBus学习记录
- Swift: App审核基本要点
- Loadrunner12回放时不能打开浏览器
- Spring注解@Component、@Repository、@Service、@Controller区别
- python多线程异步post请求脚本,可以设置持续运行时间、线程数、时间间隔
- 京东云centos6.8挂载高效云盘
- 三维数学基础之坐标系、向量、矩阵
- 用js生成UUID
- Eclipse固定编码,与防止使用maven输出中文乱码