一、下载EventBus的类库java
源码:https://github.com/square/ottogit
二、基本使用github
@Subscribeide
订阅事件,也就是事件的处理者,它有且仅有一个参数YourEvent,每个Subscribe对应处理一个YourEvent。Event用于链接(匹配)post和订阅。@Subscribe使用举例:post
@Subscribe public void reveiverMethod(YourEvent event){ //...TODO }
@Produce
this
产生事件,改方法在对象被register后即被调用(–使用状况比较特殊的),该方法必须有一个非空的返回值,参数必须为空。 bus.post(new YourEvent(…))spa
发送一个事件,等待@Subcribe处理debug
public class MainActivity extends Activity { TextView tvShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BusManager.getInstance().register(this); System.out.println(debug:onCreate); setContentView(R.layout.activity_main); findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { BusManager.getInstance().post(new MyEvent(将我点击的内容,发送出去)); } }); tvShow = (TextView) findViewById(R.id.tv_show); } @Override protected void onDestroy() { super.onDestroy(); BusManager.getInstance().unregister(this); } @Subscribe public void receiveEventByParam(MyEvent event) { System.out.println(debug: + event.getContent()); if (tvShow != null) { tvShow.setText(event.getContent()); } } @Produce public MyEvent sendEvent() { return new MyEvent(这是我产生的事件(@Produce)); } }
BusManager 是一个单例code
public class BusManager { private static Bus bus = null; private BusManager() { } public static synchronized Bus getInstance() { if (bus == null) { bus = new Bus(); } return bus; } }
MyEvent 本身定义的事件类orm
public class MyEvent { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public MyEvent(){ } public MyEvent(String content) { super(); this.content = content; } }
运行结果
05-20 20:41:59.923: I/System.out(30320): debug:这是我产生的事件(@Produce) 05-20 20:41:59.923: I/System.out(30320): debug:onCreate 05-20 20:42:11.553: I/System.out(30320): debug:将我点击的内容,发送出去
每次调用registe()方法是,会当即调用@Produce方法,将return的事件发送出去,由参数为MyEvent的@Subscribe方法接收并处理。bus.post()也是如此。
原理
主要是Bus.java里面的代码:
关键的方法有:
public void register(Object object)
该方法的做用是查找object里面全部带有Produce和Subscribe注解的方法,并保存在Map中,而且会当即执行Produce注解的方法。
public void post(Object event)
发送事件event,根据以前注册过的object里面的方法,查找参数为event的Subscribe方法,并invoke该方法。这样就达到了post以后,调用对应Subscribe方法的目的。
public void unregister(Object object)
注销object,删除掉map中保存的object的方法,释放object,防止内存泄露。