Android事件总线——EventBus的使用

前言

首先我们来说下事件总线,它的作用:为了更简化并更高质量的在Activity,Fragment,Thread和Service等之间的通信,解决组件之间高耦合的同时仍能进行高效的通信。

什么是EventBus

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

其优点是开销小,代码更优雅,将发送者和接收者解耦。

EventBus的使用

EventBus三要素
  • Event:事件。(任意类型)
  • Subscriber:事件订阅者。在EventBus3.0之前仅限定于4种线程模型(onEvent,onEventMainThread,onEventBackgroundThread和onEventAysnc)。而在EventBus3.0之后,事件处理方法任意命名,但必须添加一个注解@Subscribe,并指定线程模型(默认为POSTING)。
  • Publisher:事件发布者。调用EventBus的post(Object)。根据post参数类型,自动调用相应事件的函数。
EventBus4种ThreadMode(线程模型)
  • POSTING(默认):发布事件和接收事件在同一个线程。在使用该线程模型事件处理函数中尽量避免执行耗时操作,会导致线程阻塞,甚至引发ANR异常。
  • MAIN:处理事件在UI线程执行。事件处理的事件不能太长,太长会导致ANR。
  • BACKGROUND:如果事件在UI线程发布,则该事件函数处理在新的线程中运行;如果事件在子线程发布,则事件函数处理直接在发布线程中运行。此事件处理函数禁止更行UI操作。
  • ASYNC:无论事件在哪个线程发布,该事件函数处理都会在新建的子线程中执行。同样,该事件处理函数禁止更行UI操作。
EventBus的基本用法

(1) 自定义一个事件类

public class MessageEvent{
    ...
}

(2)在需要订阅该事件的地方注册事件

EventBus.getDefault().register(this);

(3)发送事件

EventBus.getDefault().post(messageEvent);

(4)处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent){
    ...
}

(5)取消注册事件

EventBus.getDefault().unregister(this);

代码示例

(1)添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
(2)定义消息事件类
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;
    }
}
(3)注册和取消订阅事件
public class MainActivity extends AppCompatActivity {

    private TextView tv_message;
    private Button btn_subscription, btn_message;

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

        tv_message = (TextView) findViewById(R.id.tv_message);
        tv_message.setText("MainActivity");

        btn_subscription = (Button) findViewById(R.id.btn_subscription);
        btn_subscription.setText("注册事件");

        btn_message = (Button) findViewById(R.id.btn_message);
        btn_message.setText("跳转到SecondActivity");

        btn_subscription.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //注册事件
                EventBus.getDefault().register(MainActivity.this);
            }
        });

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册事件
        EventBus.getDefault().unregister(MainActivity.class);
    }
}
(4)事件订阅者处理事件

在MainActivity中自定义方法来处理事件。

 @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMoonEvent(MessageEvent messageBean) {
        //展示收到的消息
        tv_message.setText(messageBean.getMessage());
    }
(5)事件发布者发布事件

创建SecondActivity发布消息。

public class SecondActivity extends AppCompatActivity {

    private TextView tv_message;
    private Button btn_message;

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

        tv_message = (TextView) findViewById(R.id.tv_message);
        tv_message.setText("SecondActivity");

        btn_message = (Button) findViewById(R.id.btn_message);
        btn_message.setText("发送事件");

        btn_message.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new MessageEvent("欢迎学习EventBus"));
                finish();
            }
        });
    }
}

运行程序如下,当我们点击MainActivity中的“注册事件”按钮来注册事件,然后点击“跳转到SECONDACTIVITY”按钮,跳转到SecondActivity。接下来我们点击“发送事件”,这时候finishSecondActivity,显示MainActivity,TextView显示“欢迎学习EventBus”。这样MainActivity成功的接收到了SecondActivity中发送的事件。如图:

main

second

main2

EventBus的黏性事件

EventBus黏性事件,就是发送该事件之后再订阅该事件也能收到该事件。修改代码如下:

(1)订阅者处理黏性事件
 @Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
    public void onMoonStickyEvent(MessageEvent messageEvent){
        tv_message.setText(messageEvent.getMessage());
    }
(2)发送黏性事件

在SecondActivity中定义Button发送黏性事件。

btn_subscription.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().postSticky(new MessageEvent("黏性事件"));
                finish();
            }
        });

现在我们运行程序,在我们的MainActivity中没有点击“注册事件”,直接跳转到SecondActivity中发送黏性事件。这时回到我们的MainActivity界面。

stillSecond

————————————>

stillMain

接下来我们点击注册事件,你会发现TextView发生改变显示“粘性事件”,这时大功告成。

stillMain2

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);
}

总结

欢迎童鞋们学习EventBus的基本使用。

更多请查看:
EventBus的github地址:https://github.com/greenrobot/EventBus
EventBus官网:http://greenrobot.org/eventbus/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值