EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線竟坛。簡(jiǎn)化了應(yīng)用程序內(nèi)各組件間、組件與后臺(tái)線程間的通信。優(yōu)點(diǎn)是開(kāi)銷小担汤,代碼更優(yōu)雅涎跨,以及將發(fā)送者和接收者解耦。如果Activity和Activity進(jìn)行交互還好說(shuō)崭歧,如果Fragment和Fragment進(jìn)行交互就著實(shí)令人頭疼了隅很,我們會(huì)使用廣播來(lái)處理,但是使用廣播稍顯麻煩并且效率也不高率碾,如果傳遞的數(shù)據(jù)是實(shí)體類叔营,那么還需要序列化,那么很顯然成本會(huì)有些高所宰。下面我們就來(lái)學(xué)習(xí)一下EventBus3.0的使用方法绒尊。
EventBus概述
EventBus的三要素:EventBus有三個(gè)主要的元素需要我們先了解一下:
- Event:事件
- Subscriber:事件訂閱者,在EventBus3.0之前消息處理的方法只能限定于onEvent仔粥、onEventMainThread婴谱、onEventBackGroundThread和onEventAsync,他們分別代表四種線程模型躯泰。而EventBus3.0之后谭羔,事件處理的方法可以隨便取名,但是需要添加一個(gè)注釋@Subscribe麦向,并且要指定線程模型(默認(rèn)為POSTING)瘟裸,四種線程模型在下面會(huì)一一講到。
- Publisher:事件發(fā)布者诵竭,可以在任意線程任意位置發(fā)送事件话告,直接調(diào)用EventBus的post(Object)方法÷盐浚可以自己實(shí)例化EventBus對(duì)象超棺,但一般使用EventBus.getDefault()就好了,根據(jù)post函數(shù)參數(shù)的類型呵燕,會(huì)自動(dòng)調(diào)用訂閱相應(yīng)類型事件的函數(shù)。
EventBus3.0有以下四種ThreadMode:
- POSTING(默認(rèn)):如果使用事件處理函數(shù)指定了線程模型為POSTING件相,那么該事件在哪個(gè)線程發(fā)布出來(lái)的再扭,事件處理函數(shù)就會(huì)在這個(gè)線程中運(yùn)行,也就是說(shuō):發(fā)布事件和接收事件在同一個(gè)線程中夜矗。在線程模型為POSTING的事件處理函數(shù)中盡量避免執(zhí)行耗時(shí)操作泛范,因?yàn)樗鼤?huì)阻塞事件的傳遞,甚至有可能引起ANR異常紊撕。
- MAIN:事件的處理會(huì)在UI線程中執(zhí)行罢荡,事件處理事件不能太長(zhǎng),事件長(zhǎng)了會(huì)ANR異常。
- BACKGROUND:如果事件是在UI線程中發(fā)布出來(lái)的区赵,那么該事件處理函數(shù)就會(huì)在新的線程中運(yùn)行惭缰,如果事件本來(lái)就是在子線程中發(fā)布出來(lái)的,那么該事件處理函數(shù)直接在發(fā)布事件的線程中執(zhí)行笼才。在此事件處理函數(shù)中禁止進(jìn)行UI更新操作漱受。
- ASYNC:無(wú)論事件在哪個(gè)線程發(fā)布,該事件處理函數(shù)都會(huì)在新建的子線程中執(zhí)行骡送,同樣昂羡,此事件處理函數(shù)中禁止進(jìn)行UI更新操作。
EventBus3.0基本用法
EventBus使用起來(lái)很簡(jiǎn)單摔踱,分為五個(gè)步驟:
(1).自定義一個(gè)事件類
public class MessageEvent {
...
}```
**(2).在需要訂閱事件的地方注冊(cè)事件**
EventBus.getDefault().register(this);```
(3).發(fā)送事件
EventBus.getDefault().post(messageEvent);```
**(4).處理事件**
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
...
}```
前面我們說(shuō)過(guò)虐先,消息處理的方法可以隨便取名,但是需要添加一個(gè)注解@Subscribe派敷,并且要指定線程模型(默認(rèn)為POSTING)蛹批。
(5).取消事件訂閱
EventBus.getDefault().unregister(this);```
**EventBus3.0應(yīng)用**
上面講到了基本用法,有的同學(xué)可能還是有些不懂膀息,下面我就舉個(gè)例子來(lái)說(shuō)明一下:
在AS項(xiàng)目中配置gradle般眉,添加依賴庫(kù):
compile 'org.greenrobot:eventbus:3.0.0'```
定義消息事件類,代碼如下:
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}```
**注冊(cè)和取消訂閱事件**
MainActivity中注冊(cè)和取消訂閱事件(MainActivity.[Java](http://lib.csdn.net/base/javase)):
public class MainActivity extends AppCompatActivity {
private TextView tv_message;
private Button bt_message;
private Button bt_subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message=(TextView)this.findViewById(R.id.tv_message);
tv_message.setText("MainActivity");
bt_subscription=(Button)this.findViewById(R.id.bt_subscription);
bt_subscription.setText("訂閱事件");
bt_message=(Button)this.findViewById(R.id.bt_message);
bt_message.setText("跳轉(zhuǎn)到SecondActivity");
bt_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
bt_subscription.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注冊(cè)事件
EventBus.getDefault().register(MainActivity.this);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注冊(cè)事件
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}
@Subscribe(sticky = true)
public void ononMoonStickyEvent(MessageEvent messageEvent{
tv_message.setText(messageEvent.getMessage());
}
} ```
事件訂閱者處理事件
這里我們的ThreadMode設(shè)置為MAIN潜支,事件的處理會(huì)在UI線程中執(zhí)行甸赃,用TextView來(lái)展示收到的事件消息:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}```
**事件發(fā)布者發(fā)布事件**
這里創(chuàng)建了SecondActivity來(lái)發(fā)布消息:
public class SecondActivity extends AppCompatActivity {
private Button bt_message;
private TextView tv_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message=(TextView)this.findViewById(R.id.tv_message);
tv_message.setText("SecondActivity");
bt_message=(Button)this.findViewById(R.id.bt_message);
bt_message.setText("發(fā)送事件");
bt_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent
("歡迎關(guān)注wangling的博客"));
finish();
}
});
}
}```
接下來(lái)我們點(diǎn)擊按鈕進(jìn)入SecondActivity并點(diǎn)擊該界面中的發(fā)送事件按鈕冗酿,這時(shí)SecondActivity被finish掉埠对,MainActivity的TextView顯示”歡迎關(guān)注劉望舒的博客”:
EventBus3.0粘性事件
除了上面講的普通事件外,EventBus還支持發(fā)送黏性事件裁替,就是在發(fā)送事件之后再訂閱該事件也能收到該事件项玛,跟黏性廣播類似
。