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学习记录的主要内容,如果未能解决你的问题,请参考以下文章

EventBus详解

EventBus使用详解——初步使用EventBus

EventBus使用详解——初步使用EventBus

即时聊天APP - 消息的接收以及EventBus使用

Android 使用EventBus发送消息接收消息

Android项目实战(十三):浅谈EventBus