当前位置:   article > 正文

Android发布订阅事件总线EventBus_android 事件订阅是什么

android 事件订阅是什么

概述

什么是EventBus?

EventBus内部角色介绍

配置

实战案例


概述

在之前传统的Android开发中,线程间或者Activity、Service等组件之间传递消息我们比较倾向于Intent、Handler、Broadcast去实现。接下来跟大家探讨一个很好用的Android的发布/订阅事件总线框架EventBus,这个框架在之前的项目中也有使用过,直到今天才决定整理一片文章梳理下该框架,方便自己梳理内容和提供给大家参考。

什么是EventBus?

EventBus是用于Android的发布/订阅事件总线机制的框架,主要功能是替代Intent、Handler、Broadcast在例如Activity、Fragment这样的功能组件之间或者是线程间的消息传递,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。EventBus的优点在于代码优雅,消耗更少,并且将发送者与接受者解耦(降低两者之间的依赖程度)。

EventBus内部角色介绍

Event :传递的事件对象
Subscriber :事件的订阅者
Publisher:事件的发布者
ThreadMode :定义EventBus的线程模式

EventBus官方逻辑图

EventBus的大致工作流程是先自定义一个类,定义一个事件(Event)类型。然后在要接收消息的界面(订阅者Subscriber)进行注册。接下来在要发送信息的界面(发布者Publisher)进行信息的发送。消息发出后然后在订阅者的界面进行消息的接收。当所有操作完成之后解除EventBus的注册。

EventBus的四种线程模式
ThreadMode.POSTIONG:表示该方法会在当前发布事件的线程执行,默认的线程模式
ThreadMode.MAIN:表示在UI线程(主线程)中执行。
ThreadMode.BACKGROUND:如果当前线程不是主线程,则在当前线程执行。否则加入后台任务队列,使用线程池调用。
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用。

Subscriber Priorities(优先级)
优先级顾名思义,等级越高越先执行。EventBus可以通过调整priority来设置优先级,用整数来设置,数字的值越大优先级别越高,越优先执行。

配置

方式一:下载jar包导入工程
Jar包下载地址:https://github.com/greenrobot/EventBus/releases
下载好EventBus的jar包后导入项目的libs目录,然后右键add as library

方式二:在build.gradle中添加网络依赖
compile ‘org.greenrobot:eventbus:3.0.0’

实战案例

为了更好的理解EventBus的工作机制,找了一个Demo加上注解,方便理解。
首先自定义一个类,用来定义事件类型:

public class MyEvent {
    private String mMsg;
    public MyEvent(String msg){
        mMsg = msg;
    }

    public String getMsg(){
        return mMsg;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后在要接收消息的界面(订阅者Subscriber)进行注册、信息接收:

/**
 * 事件的订阅者   Subscriber
 */
public class MainActivity extends Activity {

    Button button;
    TextView textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在要接收消息的页面进行注册
        EventBus.getDefault().register(this);

        button = (Button) findViewById(R.id.btn01);
        textview = (TextView) findViewById(R.id.tv01);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    public void onEventMainThread(FirstEvent event) {
        String msg = "onEventMainThread收到了消息:" + event.getMsg();
        tv.setText(msg);
        Toast.makeText(this, msg , Toast.LENGTH_SHORT).show();
    }

        @Override
    protected void onDestroy() {
        super.onDestroy();
        //在onDestroy生命周期中解除注册
        EventBus.getDefault().unregister(this);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

接下来在要发送信息的界面(发布者Publisher)进行信息的发送:

/**
 * 事件发布者  Publisher
 */
public class SecondActivity extends Activity {
    private Button btn_SendMsg;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        btn_SendMsg = (Button) findViewById(R.id.btn_first_event);

        btn_SendMsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送事件
                EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));
            }
        });

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/178110
推荐阅读
相关标签
  

闽ICP备14008679号