Android事件总线EventBus使用总结

Author Avatar
wshunli 1月 17, 2018
  • 在其它设备中阅读本文章

EventBus是一款针对Android优化的发布/订阅事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。

EventBus 发布订阅模式

主要是替代 handler BroadCast 在 Fragment 、Activity 、Service 线程之间传递消息。

EventBus 概述

1、EventBus 有三个主要的元素:

  • Event:事件,可以是任意类型的对象。
  • Subscriber:事件订阅者,在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他们分别代表四种线程模型。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型下面会讲到。
  • Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就好了,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。

2、EventBus3.0有以下四种ThreadMode(线程模型):

  • POSTING(默认):发布事件和接收事件在同一个线程,也就是说该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。
  • MAIN: 事件的处理总是在UI线程中执行。
  • ASYNC:无论事件在哪个线程发布,该事件处理函数总是在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
  • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。

EventBus 快速入门

0、首先为项目添加 EventBus 依赖:

compile 'org.greenrobot:eventbus:3.1.1'

1、定义事件类:

public static class MessageEvent { /* Additional fields if needed */ }

2、准备订阅者:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};

3、发送事件:

EventBus.getDefault().post(new MessageEvent());

EventBus 实际应用

这里举例子具体介绍 EventBus 的用法,实现Activity之间传值。

1、定义消息事件类

package com.wshunli.eventbusdemo;

public class MessageEvent {

    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "MessageEvent{" +
                "message='" + message + '\'' +
                '}';
    }
}

2、注册和取消订阅事件

根据组件的声明周期,在 MainActivity.java 中注册/取消订阅事件。

package com.wshunli.eventbusdemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {
    private TextView textView;

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

        // 注册订阅事件
        EventBus.getDefault().register(this);

        // 跳转到 SecondActivity
        findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });

        textView = findViewById(R.id.text);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消订阅事件
        EventBus.getDefault().unregister(this);
    }
}

3、添加消息处理函数

在 MainActivity.java 中添加事件的处理函数:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        textView.setText(String.format("接收到发送的事件:%s", event.getMessage()));
    }

我们选择 threadMode = ThreadMode.MAIN 表示总是在 主线程 中执行。

4、发布事件

在 SecondActivity 中发布事件:

package com.wshunli.eventbusdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import org.greenrobot.eventbus.EventBus;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MessageEvent("来自SecondActivity的消息"));
                finish();
            }
        });
    }
}

5、接收到消息

在 MainActivity 接受到来自 SecondActivity 中发送的消息:

EventBus消息

ProGuard 混淆规则

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

参考资料
1、greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.
https://github.com/greenrobot/EventBus
2、Android事件总线(一)EventBus3.0用法全解析 - 刘望舒的专栏 - CSDN博客
http://blog.csdn.net/itachi85/article/details/52205464
3、EventBus 3.0的用法详解(一) - neu - SegmentFault
https://segmentfault.com/a/1190000004279679
4、Android事件分发库的使用-慕课网
https://www.imooc.com/learn/871

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/6a115a99.html