說明
EventBus相信大家不會陌生,它可以極大的簡化元件之間的通信,元件和背景線程之間的通信,今天我們來使用一下
我們模拟這樣一個需求,在項目中也有可能用到的
一個注冊的界面,需要下一步,下一步,最後注冊成功将資料送出然後又傳回到了主界面
我們這裡簡單使用一下,Activity之間傳遞資訊就省略了,我們就模拟一下finish多個Activity的情景
還記得郭神的第一行代碼中是如何finish多個Activity的吧,
自定義一個ActivityCollector類,把所有Activity的都add到一個List,然後for循環finish它們。
實踐
那我們今天換一種方式,簡單使用一下EventBus:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM0YjMzMDNwEDOyUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1、添加依賴
compile 'org.greenrobot:eventbus:3.0.0'
2、自定義一個類,可以是空類,因為我們不需要傳遞一個資料,隻是去finish這個Activity,比如:
public class ActivityFinishEvent {
}
還是為了傳遞一個finish成功的消息,給他加一個message的屬性
public class ActivityFinishEvent {
private String message;
public ActivityFinishEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3、在接收消息的Activity的onCreate()方法當中注冊
EventBus.getDefault().register(this);
4、同時也一并把解除注冊寫到onDestroy當中,防止記憶體洩漏
EventBus.getDefault().unregister(this);
5、接收消息的方法實作
在EventBus3.0中,聲明一個訂閱方法需要用到@Subscribe注解,方法名可以自定義,但是必須是public
MainActivity:
//訂閱方法,當接收到事件的時候,會調用該方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(ActivityFinishEvent event){
textView.setText(event.getMessage());
Toast.makeText(MainActivity.this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
中間的其他Activity:
//訂閱方法,當接收到事件的時候,會調用該方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(ActivityFinishEvent event){
finish();
}
6、發送事件
EventBus.getDefault().post(new ActivityFinishEvent("finish所有Activity,傳回到主界面"));
發送事件在最後一個Activity中的Button的點選事件當中進行的,所有代碼如下:
public class Main4Activity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new ActivityFinishEvent("finish所有Activity,傳回到主界面"));
finish();
}
});
}
}
至此,就完成了一次EventBus的簡單使用。
了解
寫完一個簡單的例子後,我們再加深一下EventBus的了解,EventBus是觀察者模式一個很好的實踐:
一、EventBus三要素:
Event:事件,可以是任意類型的對象
Subscriber:事件訂閱者,相當于我們在Activity中接受事件的方法, 在EventBus3.0前,隻限定于onEvent、onEventMainThread、onEventBackground、onEventAsync,在EventBus3.0後,我們可以随便取名,但是需要添加個注解@Subscribe,然後去指定線程模型。
Publisher:事件釋出者,可以在任意線程任意位置發送事件,根據post的參數類型,調用訂閱相關類型事件的方法。
二、EventBus的四種線程模型(ThreadMode):
1、POSTING(預設):釋出事件和接收事件在同一線程,避免執行耗時操作,否則會ANR
2、MAIN:事件的處理在主線程、也就是UI線程,事件處理時間不能太長,否則會ANR
3、BACKGROUND:事件在UI線程釋出出來,接收事件會在新的子線程中執行,事件在子線程釋出出來,接收事件就在這個子線程中執行,此方法中禁止進行UI操作
4、ASYNC:無論在哪個線程釋出事件,接受事件都會在建立的一個子線程中執行,同樣禁止進行UI操作
粘性事件:粘性事件釋出後會存在記憶體中,比如說我已經new了2個fragment,post發送了事件之後, 這兩個Fragment可以接受到這個事件,但是我再new2個出來,接受不到了,還得重新發送,粘性事件釋出後存在記憶體中,我再new兩個Fragment出來,一看之前有這個事件,直接比對,不用重新發送事件了。使用的話直接在注解那一行加個sticky = true;
那我們再總結一下吧,
1、EventBus接收消息是根據傳入的參數來判定的,是以我們可以發送多個事件,隻要在接收事件的Activity中添加訂閱方法,就可以接受到事件,比如:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(FirstEvent event){
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(SecondEvent event){
}
發送的時候:
EventBus.getDefault().post(new FirstEvent());
EventBus.getDefault().post(new SecondEvent());
2、如果添加了多個參數一樣的訂閱方法,但他們的ThreadMode不同,也是會接收到消息的
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(FirstEvent event){
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEvent(FirstEvent event){
}
小Demo位址:EventBus小Demo
總結
EventBus的使用基本掌握,如果在項目中有用到的話,更會加深記憶。
這裡用一個小例子熟悉了一下EventBus,記錄一下,友善同學們查閱。