什么是EventBus
基用法
添加依赖库:
首先你要为你的app添加依赖库:
compile 'org.greenrobot:eventbus:3.0.0'
注册
举个例子,你需要在一个activity中注册eventbus事件,然后定义接收方法,这和Android的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI,在EventBus中,你同样需要这么做。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //注册 EventBus.getDefault().register(this); }
订阅者
类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了(看不懂没关系):
//接收消息的内部方法 @Subscribe(threadMode =ThreadMode.MAIN) public void helloEventBus(String message){ tvMsg.setText(message); }
该操作很简单,定义了一个hello方法,需要传入String参数,在其中操作UI操作,注意:
我们添加了注解@Subscribe,其含义为订阅者,在其内传入了threadMode,我们定义为ThreadMode.MainThread,其含义为该方法在UI线程完成。
发布者
既然你在某个地方订阅了内容,当然就会在某个地方发布消息,比如A跳转到B页面,当B页面的按钮发生点击事件的时候B页面关闭并且将消息传递回给A页面
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post("传递EventBus的测试数据"); finish(); } });
注解
新增的@Subscribe
其中ThreadMode提供了四个常量:
-
MainThread 主线程
-
BackgroundThread 后台线程
-
Async 后台线程
-
PostThread 发送线程(默认)
BackgroundThread:当事件是在UI线程发出,那么事件处理实际上是需要新建单独线程,如果是在后台线程发出,那么事件处理就在该线程。该事件处理方法应该是快速的,避免阻塞后台线程。
Async:发送事件方不需要等待事件处理完毕。这种方式适用于该事件处理方法需要较长时间,例如网络请求。
sticky = true
默认情况下,其为false。什么情况下使用sticky呢?
EventBus.getDefault().postSticky(new VoteEvent(obj));
EventBus.getDefault().register(this);
@Subscribe(sticky = true)
什么时候使用sticy,当你希望你的事件不被马上处理的时候,举个栗子,比如说,在一个详情页点赞之后,产生一个VoteEvent,VoteEvent并不立即被消费,而是等用户退出详情页回到商品列表之后,接收到该事件,然后刷新Adapter等。其实这就是之前我们用startActivityForResult和onActivityResult做的事情。
priority = 1
相信大部分人知道该用法,值越小优先级越低,默认为0。
在企业级开发中如何使用Eventbus
EventBus在企业开发中还是用得比较多的,但是相信很多人会问在企业开发中的使用会是上述的那么简单的使用吗,回答肯定是否定的,在企业开发中使用eventbus往往都要创建一个事件类,把你的每一个参数(或者可能发生冲突的参数),封装成一个类,以我们公司为例,提供一个企业开发的eventbus的使用模板:
创建模板
发送数据
EfunEvent event = new EfunEvent(); event.event = 993 EventBus.getDefault().post(event);
接收数据
public static final int CART_EVENT_SETPRICE = 933; @Subscribe(threadMode = ThreadMode.MAIN) public void onMainEventBus(EfunEvent event) { switch (event.event) { case CART_EVENT_SETPRICE: finish(); break; default: break; } }