EventBus,RxBus相關介紹
eventBus是一個主要用於事件的釋出和訂閱的框架,是一個釋出 / 訂閱的事件匯流排,包含4部分:釋出者,訂閱者,事件,匯流排。RxBus是一種開發思想,使用了觀察者模式的RxJava,RxAndroid實現,使用方式差不多。github地址:
EventBus https://github.com/greenrobot/EventBus
一,EventBus 總體概括
EventBus有如下特點:
- 簡化了android各元件之間的通訊。
- 適用於Activities,Fragments以及後臺程序。
- 避免了複雜的,潛在的依賴錯誤和生命週期的問題。
- 讓程式碼更簡潔。
- 響應快速,jar包小。
- 有1億以上的APP應用了enventBus
- 在跨程序通訊,訂閱者優先順序方面表現優異。
二,EventBus的使用三部曲
EventBus的使用非常簡單,定義事件event,註冊訂閱者,傳送事件。
1,定義事件
所謂的event,其實也就是一個物件,裡面攜帶了需要傳遞的資訊。
public class MessageEvent { /* 新增所需的欄位 */ }
private String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
public String getMsg () {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
2,註冊/取消訂閱者
準備訂閱者,在onCreate方法或者構造方法裡面註冊subscribers。取消註冊在onStop中呼叫unregister即可。
@Override
protected void onStart() {
super.onStart();
//註冊EventBus
EventBus.getDefault().register(this );
}
@Override
protected void onStop() {
super.onStop();
//取消EventBus
EventBus.getDefault().unregister(this);
}
只是註冊了訂閱者還不行,還需要定義事件的接收者,處理事件。
//事件1接收者:在主執行緒接收
public void onEvent(String event){
mShowInfo1.setText(event);
}
//事件2接收者:在主執行緒接收自定義MessageEvent訊息
public void onEvent(MessageEvent event){
mShowInfo21.setText(event.getMsg());
}
//事件3接收者:在主執行緒接收
public void onEventMainThread(Integer event) {
mShowInfo2.setText(event+"");
}
3,傳送事件
eventBus.post(event);就可以傳送事件,對應的subscribers會在onEvent裡面處理這個事件。
//事件1傳送者:在主執行緒傳送
EventBus.getDefault().post("duqian test!");
//事件2傳送者:在主執行緒傳送自定義MsgBean訊息
EventBus.getDefault().post(new MessageEvent("type"));
//事件3傳送者:在子執行緒傳送
int mCount = 0;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
EventBus.getDefault().post(mCount);
if (mCount >= 3) {
this.cancel();
mCount = 0;
}
mCount++;
}
}, 0, 1000);
三,RxBus
Rxbus使用方式和EventBus一樣,在oncreate 或者 onResume等地方註冊,和取消註冊(如onPause和onDestroy),在初始化同時,可以指定接收後所執行的執行緒。RxBus的思想是使用 RxJava 來實現了 EventBus ,而不再需要使用OTTO或者 GreenRobot 的EventBus。
1,註冊事件,register
Observable<UserBean> observable = RxBus.getInstance().register(this);
observable.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<UserBean>() {
@Override
public void call(UserBean userBean) {
Log.d("Test", "received :" + userBean.toString());
}
});
2,取消註冊,unregister
RxBus.getInstance().unregister(this);
3,傳送事件,Post
RxBus.getInstance().post(new UserBean("rxbus", 291902259));
四,總結
EventBus,RxBus是android平臺效能極佳的事件匯流排,簡化了 Activities, Fragments, Threads, Services等元件的通訊,最少的程式碼,最佳的質量。
RxJava要比EventBus的應用更廣泛,EventBus僅僅是作為一種訊息的傳遞工具,但是RxJava裡面幾乎可以做任何事情。
如果是Android開發的話,可以使用RxAndroid,這是對RxJava的一個擴充套件,結合retrofit可以很輕鬆的完成網路的訪問。
EventBus有個缺點,使用了EventBus的類都不能進行混淆,否則Evnetbus就找不到OnEvent方法了。
推薦使用RxJava/RxAndroid。看我的另一分享:
RxJava+Retrofit+Gson實現網路請求
簡單分享下使用,未完待續,歡迎交流。杜乾,Dusan,Q 291902259