EventBus的简单使用

一、概述

EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递,事件可以理解为消息。

在这里插入图片描述

优点:
调度灵活,使用简单,快速且轻量。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类。通知的优先级,能够保证 Subscriber 关注最重要的通知。粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。EventBus 的 Subscriber 注册非常简单,调用 eventBus 对象的 register 方法即可,如果不想创建 eventBus 还可以直接调用静态方法 EventBus.getDefault() 获取默认实例,Subscriber 接收到通知之后的操作放在 onEvent 方法里就行了。成为 Publisher 的过程就更简单了,只需要调用合适的 eventBus(自己创建的或是默认的)的 post 方法即可。作为 github 的明星项目之一, EventBus 的源代码中许多技巧来改善性能;

GitHub地址
源码地址:https://github.com/greenrobot/EventBus/

缺点:
代码逻辑不是很清楚,在 Subscriber 注册的时候,Subscriber 中的方法会被遍历查找以 onEvent 开头的 public 方法。这将带来一些问题,一旦对代码进行混淆,就无法查找到了。好消息是 EventBus 已经打算使用注解来实现,这应该能够解决代码混淆的问题。
但有一个缺点是观察者独有的,那就是观察者可能会造成接口的膨胀。特别是当程序要求大量形式各异的通知,而程序员有没有做出良好的抽象时,代码中会包含大量的接口,接口数量的增长又会带来命名、注释等等一大堆问题。本质上说观察者要求程序员从零开始实现事件的产生、分发与处理过程,这就要求参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。

二、基本使用
1.在gradle添加依赖
compile ‘org.greenrobot:eventbus:3.0.0’

2.自定义一个事件类

public class BaseObjectEvent {}

3.准备subcriber(订阅)的回调method,来处理post event,用注解@Subscribe来定义subscriber的回调method,方法名可以任意定义。

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onBaseObjectEvent(BaseObjectEvent event) {};

注册与反注册subcriber(订阅)一般都是在onCreate()和onDestory()注册与反注册

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onDestory() {
    super.onDestory();
    EventBus.getDefault().unregister(this);
}

(3).post事件

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

三:接收函数
EventBus有4个不同的函数
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

四:实例
下面我们来实现一个具体的例子来介绍EventBus的基本使用。
事件类Event:

/**
 * desc: 1、定义一个消息类
 */
public class BaseObjectEvent {

    public static final int ERROR_RESPONSE = -1000;
    public static final int ADD_FRIEND = 10001;
    public static final int GET_MESSAGE_LIST = 10002;
    public static final int AGREE_FRIEND = 10003;
    public static final int NOTICE_AGREE_FRIEND = 10004;
    public static final int CREATE_GROUP_NAME = 10005;
    public static final int NOTICE_GROUP_NAME = 10006;
    public static final int ADD_GROUP_MEMBER = 10007;
    public static final int DEL_GROUP_MEMBER = 10008;
    public static final int ADD_DISCUSS_GROUP = 10009;
    public static final int ERROR_ADD_DISCUSS_GROUP = -10009;
    public static final int NOTICE_DISCUSS_GROUP_NAME = 10010;
    public static final int EXIT_DISCUSS_GROUP = 10011;//退出讨论组
    public static final int Add_DISCUSS_GROUP = 10012;//拉人进讨论组
    public static final int QR_SCAN = 10013;//扫描二维码
    public static final int QR_ADD_FRIEND_SCAN = 10014;//扫描二维码添加好友
    public static final int QR_GET_FRIEND_INFO = 10015;//扫描二维码获取好友信息
    public static final int DEL_FRIEND = 10016;
    public static final int DEL_FRIEND_USER_PROFILEACTIVITY_NOTICE = 10017;//UserProfileActivity个人信息界面删除通知通讯录界面刷新
    public static final int SET_LAST_MESSAGE_READED = 10018;
    public static final int SET_LAST_MESSAGE_READED_BY_CONVERSATION_ID = 10019;
    public static final int LeaveGroup_Response_VALUE = 268435476;
    public static final int RemoveGroup_Response_VALUE = 268435467;
    public static final int Kick_Event_VALUE = 1073741825;
    public static final int GetOrg_Response_VALUE = 268435477;
    public int type;
    public Object data;

    public BaseObjectEvent(int type, Object data) {
        this.type = type;
        this.data = data;
    }

    @Override
    public String toString() {
        return "BaseObjectEvent{" +
                "type=" + type +
                ", data=" + data +
                '}';
    }
}

AActivity中在OnCreate()函数中注册EventBus,在OnDestroy()函数中反注册。

/**
 * desc: EventBus的使用总结
 */
public class AActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        //注册
        EventBus.getDefault().register(this);
    }

    /**
     * 事件响应方法
     * 接收消息
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onBaseEvent(final BaseObjectEvent event) {
        LogUtil.e("onBaseEvent = " + event.toString());
        //当多个地方使用的时候用type区分 根据自己项目需求而定
        switch (event.type) {
            case ADD_FRIEND: {//对方添加好友
                break;
            }
            case AGREE_FRIEND: //同意添加好友
                break;
        }
    }

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

BActivity中post事件:

public class BActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String message = "Hello,World!";
                        EventBus.getDefault().post(new BaseObjectEvent(ADD_FRIEND, message));//告诉EventBus的世界你来了
                    }
                }).start();
            }
        });
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值