EventBus3.0实用教程

作为一个Android开发者,我们在日常的开发中肯定会使用到EventBus,比如说当我们在做app的消息模块的时候,接收到后台推送的消息之后,为了方便用户查看,就需要把消息保存到本地,正常情况下在页面上会有个badge显示消息数量,如果我们不在badge显示界面的话,就需要在接收到后台推送之后更新badge上显示的消息数量,这个时候就可以使用EventBus发出一个事件,这样订阅者接收到事件之后,就会从数据库拿未读消息数,显示在badge上面。说了这么多,下面就简单的介绍下EventBus的使用:

EventBus地址:GitHub

一、EventBus 介绍

ventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。这个消息总线主要有三个部分:
1. 事件(Event)
2. 事件订阅者(Subscriber)(有没有想到RxJava里面的订阅者 ==。)
3. 事件发布者(Publisher)

官方的关系图

官方关系图

特征叙述:

  • 简化组件间的通信
    • 事件发送者和接收者解耦
    • 在活动、片段和后台线程中执行良好
    • 避免了复杂、易出错的依赖关系和生命周期问题
  • 使你的代码更加简单
  • 快!
  • 小!(大约50K)
  • 在100,000,000+个程序上使用
  • 先进特征,比如指定线程、设置优先级等

二、使用EventBus仅需四步

1. 添加依赖

使用Gradle

compile 'org.greenrobot:eventbus:3.0.0'

或者Maven

<dependency>
    <groupId>org.greenrobot</groupId>
    <artifactId>eventbus</artifactId>
    <version>3.0.0</version>
</dependency>

又或者下载Jar包添加到项目中
jar包下载

2. 定义事件(Event)

public class TestMsg {
}

这个TestMsg由从事件发布者发出,到事件订阅者接收,当然也可以加上额外的信息,比如下面可以传递name

public class TestMsg {
    private String name;

    public TestMsg(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

3. 定义事件接收者(Subscriber)

首先在所属的ActivityonCreate()里面注册

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_lib);
        EventBus.getDefault().register(this);
    }

onDestory里面取消注册

@Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

然后定义处理事件:

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(TestMsg testMsg) {

        if (testMsg != null) {
            Log.d("MainActivity", "你收到的名字为: "+testMsg.getName());
        }
    }

这里的定义了事件接收者以及使用注解@Subscribe(threadMode = ThreadMode.MAIN)指定了执行的线程。ThreadMode有下面四种类型:

  1. MAIN UI主线程
  2. POSTING 默认调用方式,在调用post方法的线程执行,避免了线程切换,性能开销最少

  3. BACKGROUND 如果调用post方法的线程不是主线程,则直接在该线程执行。
    如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作

  4. ASYNC 开辟新独立线程,用来执行耗时操作,例如网络访问。

当然这里可以在注解里面设置优先级,比如下面设置优先级为100,越大就越线先接收到事件:

@Subscribe(threadMode = ThreadMode.POSTING,priority = 100)
    public void onEventMainThread(TestMsg testMsg) {

        if (testMsg != null) {
            Log.d("MainActivity", "你收到的名字为: "+testMsg.getName());
        }
    }

如果你有三个接收事件,并且设置了不同的优先级,比如100、50、10,你也可以在priority = 100的接收到之后取消事件的传递,那么priority = 50和10的就不会接收到事件了。但是请注意,只能在ThreadMode.PostThread类型的才能取消,其他的三种ThreadMode类型是不能取消的。

如何设置:

EventBus.getDefault().cancelEventDelivery(event) ;

4.定义事件发布者(Publisher)发出事件

sendMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new TestMsg("测试EventBus"));
            }
        });

我写了一个小Demo,这个Demo是我在主module,也就是在app下面定义了事件接收者,在主app依赖的module下面发出事件来测试的。结果是可行的。有兴趣的小伙伴可以去看下:

Demo地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EventBus是一种用于Android应用程序中发布/订阅事件的库。它遵循发布-订阅模式,允许不同组件之间进行松散耦合的通信。 在基于EventBus 3.0的APP开发中,你可以按照以下步骤进行: 1. 添加EventBus依赖 在项目的build.gradle文件中添加以下代码: ``` dependencies { implementation 'org.greenrobot:eventbus:3.2.0' } ``` 2. 创建事件类 创建一个事件类,它将包含你需要发送和接收的数据。例如: ``` public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } ``` 3. 注册订阅者 在需要接收事件的组件中,注册订阅者。例如,在Activity中: ``` @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } ``` 4. 发布事件 在需要发送事件的组件中,发布事件。例如,在Activity中: ``` EventBus.getDefault().post(new MessageEvent("Hello, world!")); ``` 5. 处理事件 在订阅者中,创建一个方法来处理接收到的事件。例如,在Activity中: ``` @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { // Do something with the event Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show(); } ``` 以上就是基于EventBus 3.0的APP开发的基本步骤。通过使用EventBus,你可以轻松地在不同组件之间传递数据,从而实现应用程序中的松散耦合通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值