本篇文章主要介紹以幾下個知識點:
- 使用 EventBus 的步驟
- 一個簡單的demo
1. EventBus 簡介
**EventBus ** 是一個基于觀察者模式的 publisher/subscriber 事件總線。通過極少的代碼實現(xiàn)模塊間的通信,使用方便锋爪,性能高狗准,降低耦合黔姜。官方架構(gòu)圖如下:
EventBus 的項目主頁地址:
??https://github.com/greenrobot/EventBus
??EventBus 的官方介紹:
??http://greenrobot.org/eventbus/
2. 使用 EventBus 的步驟
首先在項目中添加 EventBus 依賴:
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
}
EventBus 的基本用法很簡單粗悯,有如下幾個步驟:
步驟 1:定義事件(Define events)
定義事件類似定義一個實體類耘柱,如定義兩個事件如下:
/**
* Function:定義消息事件
* Author:Wonderful on 2017/3/11 09:26
*/
public class MessageEvent {
public final String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
}
/**
* Function:定義其他事件
* Author:Wonderful on 2017/3/11 09:41
*/
public class SomeOtherEvent {
public final String something;
public SomeOtherEvent(String something) {
this.something = something;
}
}
步驟 2:準(zhǔn)備訂閱者(Prepare subscribers)
訂閱者實現(xiàn)事件處理方法如捅,這個方法會在事件提交的時候被調(diào)用。需使用@Subscribe注解定義调煎,如下:
/**
* This method will be called when a MessageEvent is posted (in the UI thread for Toast)
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
Log.i("onMessageEvent-------->",event.msg);
ToastUtils.show(event.msg);//彈吐司顯示信息
}
/**
* This method will be called when a SomeOtherEvent is posted
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSomethingElse(SomeOtherEvent event){
Log.i("handleSomethingElse--->",event.something);
ToastUtils.show(event.something);
}
值得注意的是镜遣,注冊監(jiān)聽模塊必須有一個標(biāo)注Subscribe注解方法,否則在register時會拋出異常汛蝙。注解的幾個參數(shù)如下(可以點擊相關(guān)鏈接查看官方介紹):
-
threadMode:回調(diào)所在的線程
?ThreadMode: POSTING(默認(rèn)使用)
?ThreadMode: MAIN(UI線程)
?ThreadMode: BACKGROUND
?ThreadMode: ASYNC - priority: 優(yōu)先級(默認(rèn)是 0)
- sticky: 是否接收黏性事件
準(zhǔn)備完訂閱者別忘了添加注冊和注銷訂閱者烈涮,如下:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
值得注意的是:實際使用中,register窖剑、unregister 通常與 Activity坚洽、Fragment 的生命周期相關(guān),比如當(dāng)你在第一個界面準(zhǔn)備好訂閱者西土,點擊某個控件跳轉(zhuǎn)到第二個界面讶舰,在第二個界面點擊某個控件提交事件并關(guān)閉第二個界面,此時要想在第一個界面的訂閱者接受到事件做出響應(yīng),那么上面在 onStart() 中注冊就可能無效了跳昼,此時應(yīng)該在onCreate() 方法中注冊般甲。我會選擇在 onCreate() 和 onDestroy() 中分別進(jìn)行注冊和注銷:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
步驟 3:提交事件( Post events)
提交事件很簡單,在代碼中任意位置都可以提交事件鹅颊。如下:
EventBus.getDefault().post(new MessageEvent("Hello everyone"));
3. 一個簡單的Demo
利用 EventBus 實現(xiàn)點擊按鈕提交事件敷存,訂閱者接收到事件后彈出吐司提示事件內(nèi)容,以及在第二個activity 點擊按鈕提交事件并且關(guān)閉后堪伍,在第一個activity中接收到第二個activity提交的事件并作出響應(yīng)锚烦,如下:
首先定義事件:
/**
* Function:定義消息事件
* Author:Wonderful on 2017/3/11 09:26
*/
public class MessageEvent {
public final String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
}
/**
* Function:定義其他事件
* Author:Wonderful on 2017/3/11 09:41
*/
public class SomeOtherEvent {
public final String something;
public SomeOtherEvent(String something) {
this.something = something;
}
}
接著準(zhǔn)備訂閱者以及提交事件:
public class EventBusActivity extends AppCompatActivity {
TextView tv_show;//顯示內(nèi)容
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
EventBus.getDefault().register(this);
findViewById(R.id.post_message_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 提交事件
EventBus.getDefault().post(new MessageEvent("哈,這是EventBusActivity提交的事件"));
}
});
findViewById(R.id.to_other_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 跳轉(zhuǎn)到 SomeOtherActivity
IntentUtils.to(EventBusActivity.this,SomeOtherActivity.class);
}
});
tv_show = (TextView) findViewById(R.id.tv_show);
}
/**
* This method will be called when a MessageEvent is posted (in the UI thread for Toast)
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
//彈吐司顯示EventBusActivity中提交事件的信息
ToastUtils.show(event.msg);
}
/**
* This method will be called when a SomeOtherEvent is posted
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSomethingElse(SomeOtherEvent event){
//設(shè)置接收SomeOtherActivity中提交事件的內(nèi)容
tv_show.setText(event.something);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
public class SomeOtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_some_other);
findViewById(R.id.post_some_other_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new SomeOtherEvent("這是SomeOtherActivity提交的事件紅紅火火"));
finish();
}
});
}
}
好了,本篇文章就介紹到這帝雇,只是簡單的基本使用涮俄,想要了解更多去看看官方介紹,相信你收獲更大尸闸。