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数据的传输单位
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
原创粉丝点击