一、下載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,防止內存泄露。