Android 第三方類庫之EventBus 1 PS 工欲善其事必先利其器. Eventbus也是一款在開發中常用的利器 這篇也對EventBus的簡單介紹和使用,與之前個xutils介紹的級別一樣.http://www.cnblogs.com/greentomlee/p/6025470.html... ...
Android 第三方類庫之EventBus
1 PS
工欲善其事必先利其器. Eventbus也是一款在開發中常用的利器
這篇也對EventBus的簡單介紹和使用,與之前個xutils介紹的級別一樣.http://www.cnblogs.com/greentomlee/p/6025470.html
作者:修雨軒陳 @博客園
2 簡介
開源項目地址:
https://github.com/greenrobot/EventBus
EventBus是一款針對Android優化的發佈/訂閱事件匯流排。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
Eventbus 的發佈訂閱(publish/subscribe)
Eventbus 有如下優點:
· simplifies the communication between components
- decouples event senders and receivers
- performs well with Activities, Fragments, and background threads
- avoids complex and error-prone dependencies and life cycle issues
· makes your code simpler (對於程式員而言,可以簡化代碼)
· is fast (執行速度很快)
· is tiny (~50k jar) (類庫的體積很小,大約只有50k)
· is proven in practice by apps with 100,000,000+ installs
· has advanced features like delivery threads, subscriber priorities, etc.
3 環境搭建三部曲
3.1 資源下載
在github中將開源類庫下載到本地:
https://github.com/greenrobot/EventBus
作者提供的很詳細的說明文檔, 我是參考作者的文檔寫出的.在github主頁中也有簡單使用步驟.
http://greenrobot.org/eventbus/documentation/how-to-get-started/
3.2 項目環境搭建
-------------
軟體環境: Android Studio2.3 Beta3
在github中下載下來的eventbus
----------------
首先, 新建一個測試項目: TestEventBus
然後我們觀察一下下載的eventbus的目錄結構,並確定要導入的模塊是哪一個
通過對目錄中的結構分析,我們知道了:
在EventBus-master 下是有3個模塊可以供我們導入項目裡面的。 分別是:EventBus、EventBusAnnotationProcessor、EventBusPerformance。根據編程習慣我們知道:應該導入EventBus目錄。
確定了導入的類庫之後,
在該項目下新建導入的模塊
選擇‘evenbus’ 目錄進行導入。
導入成功之後的結構如下:
接下來就是對build.gradle進行編輯(註意build.gradle文件所在的目錄)
在文件中寫入這句話:
compile project(':EventBus')
(build.gradle寫入的依賴類庫的名字應該與導入EventBus之後的模塊名稱 保持一致)
3.3 測試使用
首先描述一下我們要做什麼:
為了對比intent傳遞參數和Event bus 傳遞參數的區別,同時也為了練習使用EventBus , 我們準備了兩個Activity : MainActivity 和SendMsgActivity
首先利用使用傳統的消息傳遞的方式, 將消息從MainActivity發送到SendMsgActivity上;
然後利用Eventbus 再將新的消息從SendMsgActivity傳遞到MainAvtivity上。
PS 利用intent傳遞消息的這部分不在贅述
3.3.1 在接受消息的地方註冊和註銷消息
首先看MainActivity
由於需要接收來自SendMsgActivity的EvenBus消息, 所以需要新建一個實例註冊eventBus,註冊的動作應該寫在onStart()回調函數中.
@Override
protected void onStart() {// 註冊event bus
super.onStart();
EventBus.getDefault().register(this);
}
同時檔程式銷毀的時候,也需要註銷:
@Override
protected void onDestroy() {// 註銷eventBus
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.3.2 在發送消息的地方寫發送方法
SendMsgAcitivty 會使用Eventbus 發送消息, 那麼他就是消息發送的地方.
細心的同學發現了, 我並沒有在intent裡面傳遞參數. 而是使用了
ventBus.getDefault().post()
方法類發送消息. 關鍵代碼如下:
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MessageEvent("來, 給你發送一個消息..."));
Intent intent = new Intent(SendMsgActivity.this, MainActivity.class);
startActivity(intent);
}
});
其中 MessageEvent 是自定義個的 實體(結構體\bean)
public class MessageEvent {
public String msg="";
public MessageEvent(String msg)
{
this.msg = msg ;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3.3.3 在消息接受的地方書寫接受消息的動作
消息接受的地方(MainActivity)中接收消息的方法如下:
/**
* 處理接受消息的方法 “subscriber methods”
* 也可以使用註釋
* @link http://greenrobot.org/eventbus/documentation/how-to-get-started/
*
* @param evnt
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent evnt)
{
String msg = evnt.getMsg();
//this.showMsgTv = (TextView) findViewById(R.id.tv_printer);
//this.showMsgTv.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
出現的效果如圖下:
4 擴展閱讀
EventBus & Otto的使用和比較
http://www.jianshu.com/p/cb39a0018db1
RxJava和EventBus的區別?
https://www.zhihu.com/question/32179258
http://bbs.csdn.net/topics/392007033