EventBus的详解

EventBus是一个Android端优化的publih/subcribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

EventBus最大的优点是代码的可读性非常好,耦合度很低!

EventBus使用三个要素:Event事件、Subscriber事件订阅者,接受特定的事件、Publisher事件发布者,用于通知Subscriber有事件发生。


(1)Event事件:可以是任何类型的对象。

public class LoginStatusEvent {
    //登录状态
    private boolean loginStatus;


    public boolean isLoginStatus() {
        return loginStatus;
    }

    public void setLoginStatus(boolean loginStatus) {
        this.loginStatus = loginStatus;
    }
}

(2)Subcriber事件订阅者:又名事件处理者,接收到Event事件去干什么。在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都是onMessageEvent开头的函数,具体来说,函数的名字是onMessageEventPostThread,onMessageEventThread,onMessageEventBackgroundThread,onMessageEventAsync,跟ThreadMode有关。


ThreadMode,即线程模型,有下面四种。

Thread.PostThread:默认选择的线程模型。事件处理函数运行的线程与事件发出函数的线程一致,就是说该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。线程模型为PostThread的事件处理函数中尽量避免执行耗时操作。

Thread.MainThread:不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该模型可以用来更新UI。

Thread.BackgroundThread:如果发布事件的是后台线程,会直接执行事件,但如果当前是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件。该模型禁止用来更新UI。

Thread.Async:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。该模型禁止用来更新UI。

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEventMainThread(LoginStatusEvent event) {
        //同步界面
        if (((LoginStatusEvent) event).isLoginStatus()){
       //登录成功,更新界面
        }else {
            //登录失败,提示
            CommonUi.getInstance().showToast(this, "登录失败,请稍后重新登录", Toast.LENGTH_LONG);
        }
    }

(3)Publisher事件发布者,用于通知Subscriber有事件发生,可以任何线程下发布。

LoginStatusEvent loginEvent = new LoginStatusEvent();
loginEvent.setLoginStatus(true);
EventBus.getDefault().post(loginEvent);

最后提醒一下,在使用中,别忘了注册事件。

EventBus.getDefault().register(this);


当然,使用完后,取消事件订阅。

EventBus.getDefault().unregister(this);






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值