在很久之前,我就听说过事件总线很好用(EventBus),但是我一直没真正在项目中用上它,直到有一天我接手了女朋友的商城项目过来维护的时候,我发现她在开发的时候把事件总线集成上去了,用起来真特么的爽,异步完成后直接发个事件出来,接收到事件后又可以继续进行下一步操作,我个人感觉它能替换基本的广播、接口回调和Handler的一个东西,但是唯一感觉不好的就是:如果事件定义的不好,很容易导致代码混乱。接下来废话不多说,直接上教程。(由于接触不久,所以只介绍我常用到的技术,感觉很有feel,大神想研究更深入的,请忽略本文)
AndroidStudio教程步骤:
在buil.gradle中引入
compile 'org.greenrobot:eventbus:3.0.0'
即可;-
定义事件,也就是定义一个实体类而已,为了代码规范,个人习惯以 EventBus 结尾,见名思意
比如操作购物车的事件代码:public class OperShoppingCartEventBus { public int oper; //操作值 public int position; public JSR_GetShopCarList.ContentBean.ListBean listBean; public OperShoppingCartEventBus() { } /** * @param oper -1:(购物车数量-1),0:(将商品移除出购物车),1:(购物车商品数量+1、将商品添加到购物车) * @param position 操作的下标 * @param listBean 商品实体类 */ public OperShoppingCartEventBus(int oper, int position, JSR_GetShopCarList.ContentBean.ListBean listBean) { this.oper = oper; this.position = position; this.listBean = listBean; }}
就这样一个事件就定义好了,接下来就是要对这个事件进行操作了。
- 在需要发送事件的界面中调用以下发送代码语句即可:
EventBus.getDefault().post(new OperShoppingCartEventBus(1, position, getItem(position)));
post 发送一个事件其实就是实例化一个刚刚定义好的事件而已。 - 在需要接收事件的界面中要初始化EventBus 才可能接收到事件的通知,如下在Activity示例:
1.在onCreate方法中EventBusEventBus.getDefault().register(this); //注册事件
2.定义一个事件方法,也就是能接收到事件,方法一定是要传入刚刚上面定义的事件,比如:
@Subscribe(threadMode = ThreadMode.MAIN) public void onEventOper(OperShoppingCartEventBus mEventBus) { //在这里可以对根据事件来进行下一步操作 //比如:判断mEventBus.oper 的值来进行加减商品 }
细心的人一定会注意到 @Subscribe(threadMode = ThreadMode.MAIN) 这句代码
这个是用来指定线程模型,上面表示事件的处理会在UI线程中执行;
除了上面讲的普通事件外,EventBus还支持发送黏性事件,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似,有空的可以自己去深入研究一下事件总线,我感觉非常不错。
3.在onDestroy方法反注册EventBus.getDefault().unregister(this); //反注册EventBus