一、概念
什麼是EventBus
EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
簡而言之,EventBus其實就是一個通信的中介EventBus是一個消息總線,以觀察者模式實現,用於簡化程序的組件、線程通信,可以輕易切換線程、開闢線程。EventBus3.0跟先前版本的區別在於加入了annotation @Subscribe,取代了以前約定命名的方式。
二、事件
EventBus使用幾種不同的事件來進行不同模塊和不同進程之間的信息交換
-
ThreadMode.POSTING:默認的方式,在post方法的線程執行。
-
ThreadMode.MAIN: 在主線程執行
-
ThreadMode.BACKGROUND: 如果post方法不是主線程,直接在該線程執行,如果是主線程就切換到後臺執行
-
ThreadMode.ASYNC: 開闢獨立線程,內部使用來線程池,併發執行限制數量
三、使用
將其分成三步來執行(創建Message)(發送端代碼)(接收端代碼)
1、如下是Message類的創建,也就是一個基本的EventBus數據的傳輸單位
2、如下是發送端的代碼,通過post的方式來進行發送,發送端和接收端可以在不同的組件和不同的線程中public class MessageEvent {
public String name;
public MessageEvent(String name) {
this.name = name;
}
}
public class EventBusSendActivity extends Activity {
private TextView tv_title;
private Button bt_eventbus_send_main;
private TextView tv_eventbus_send_result;
boolean isFirstFlag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus_send);
initView();
initData();
initListener();
}
private void initListener() {
// 主線程發送數據按鈕點擊事件處理
bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 4 發送消息
EventBus.getDefault().post(new MessageEvent("主線程發送過來的數據"));
// 結束當前頁面
finish();
}
});
}
// 3 接收粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void StickyEventBus(StickyEvent event){
// 顯示接收的數據
tv_eventbus_send_result.setText(event.msg);
}
private void initData() {
tv_title.setText("EventBus發送數據頁面");
}
private void initView() {
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send_main = (Button)findViewById(R.id.bt_eventbus_send_main);
bt_eventbus_send_sticky = (Button)findViewById(R.id.bt_eventbus_send_sticky);
tv_eventbus_send_result = (TextView)findViewById(R.id.tv_eventbus_send_result);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 5 解註冊
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(EventBusSendActivity.this);
}
}
3、如下是接收端的代碼,通過註解的方式來進行接收的,可以看到在進行接收之前都是要進行先註冊的
public class EventBusActivity extends Activity {
private TextView tv_title;
private Button bt_eventbus_send;
private TextView tv_eventbus_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
initView();
initData();
initListener();
}
private void initListener() {
// 跳轉到發送頁面
bt_eventbus_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
startActivity(intent);
}
});
}
private void initData() {
tv_title.setText("EventBus");
//註冊廣播
EventBus.getDefault().register(EventBusActivity.this);
}
private void initView() {
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send = (Button)findViewById(R.id.bt_eventbus_send);
tv_eventbus_result = (TextView)findViewById(R.id.tv_eventbus_result);
}
// 接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void MesssageEventBus(MessageEvent event){
// 顯示接收的消息
tv_eventbus_result.setText(event.name);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 2 解註冊
EventBus.getDefault().unregister(EventBusActivity.this);
}
}
另外還有一種粘性事件的方式,就是先進行接收然後再註冊,什麼時候註冊什麼時候接收,不註冊就一直在內存中四、原理
(一)註冊原理
(1)因爲註冊實在接收端進行註冊,所以接收端就是訂閱者,而發送端就是發佈者,發佈者和訂閱者之間是通過調度中心來盡心工作的,查找訂閱者所有事件相應函數。
(2)循環每個事件相應函數,得到該事件的所有訂閱者信息,將其插入訂閱者的隊列中
(二)發送原理
(1)也就是一個Post的流程,得到當前線程的post信息及隊列
(2)將當前事件添加到當前線程的事件隊列(3)循環事件隊列中的每個事件
(4)找到對應事件的訂閱者
尊重作者,尊重原創,參考文章:
http://www.jianshu.com/p/7007b07c05d6