爲了大家讓大家更加清楚地理解EventBus並使用,本文采用課程的3W1H思路講解
WHAT
EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息
WHY
傳統的傳遞消息,Activity和Activity傳遞數據,Activity和fragment傳遞消息,Fragment和Fragment之前,還有Service和Activity。傳遞消息都使用Intent,或者接口回調,廣播,等方法,使用起來非常麻煩。
發送者和接收者耦合度太高,那麼就需要尋求一個解決方案。
首先,EventBus使用非常簡便,簡單的幾個事件處理就能解決所有的消息傳遞問題。
使得消息發送者和處理者耦合度降低,也就是解耦。具有開銷小,代碼更優雅的特點,使用更加簡便。
WHERE
當需要進行組件間通信的時候,或者一個界面的數據發生變化,其他所有的界面數據隨之發生變化的時候,可以看出,使用EventBus是多麼的方便和易控制。
HOW
(1).自定義一個事件類,可以是空類,比如:
public class AnyEventType {
public AnyEventType(){}
}
(2).獲得事件處理實例
採用EventBus.getInstance()來獲取默認的EventBus實例
(3).在要接收消息的地方進行註冊
eventBus.register(this);
(4).發消息
eventBus.post(new AnyEventType event);
(5).處理消息
public void onEvent(AnyEventType event) {}
(6).解除註冊
eventBus.unregister(this);
用一個案例來實現:
A和B兩個Activity界面,從A跳轉到B界面,從B界面發送一個事件,A收到事件後Toast打印出事件內容。
1.創建一個Android項目
2.下載EventBus的jar包導入工程
3.新建一個事件類
private String mMsg;
public EventBus(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
4.A界面接收消息註冊EventBus,點擊按鈕跳轉B界面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//註冊EventBus
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn_try);
tv = (TextView)findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.getDefault().unregister(this);//反註冊EventBus
}
//收到消息後處理
public void onEventMainThread(EventBusEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
5.B界面發送消息,調用下面的方法
EventBus.getDefault().post(
new EventBusEvent("Event start"));
實際演示,當在BActivity中點擊按鈕的時候,就會彈出一個Toast通知。