Android基础 EventBus3 0实用教程
作為一個Android開發者,我們在日常的開發中肯定會使用到EventBus,比如說當我們在做app的消息模塊的時候,接收到后臺推送的消息之后,為了方便用戶查看,就需要把消息保存到本地,正常情況下在頁面上會有個badge顯示消息數量,如果我們不在badge顯示界面的話,就需要在接收到后臺推送之后更新badge上顯示的消息數量,這個時候就可以使用EventBus發出一個事件,這樣訂閱者接收到事件之后,就會從數據庫拿未讀消息數,顯示在badge上面。說了這么多,下面就簡單的介紹下EventBus的使用:
EventBus地址:GitHub
一、EventBus 介紹
ventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與后臺線程間的通信。這個消息總線主要有三個部分:
官方的關系圖:
特征敘述:
- 簡化組件間的通信
- 事件發送者和接收者解耦
- 在活動、片段和后臺線程中執行良好
- 避免了復雜、易出錯的依賴關系和生命周期問題
- 使你的代碼更加簡單
- 快!
- 小!(大約50K)
- 在100,000,000+個程序上使用
- 先進特征,比如指定線程、設置優先級等
二、使用EventBus僅需四步
1. 添加依賴
使用Gradle:
compile 'org.greenrobot:eventbus:3.0.0' 復制代碼或者Maven:
<dependency><groupId>org.greenrobot</groupId><artifactId>eventbus</artifactId><version>3.0.0</version> </dependency> 復制代碼又或者下載Jar包添加到項目中 jar包下載
2. 定義事件(Event)
public class TestMsg { }復制代碼這個TestMsg由從事件發布者發出,到事件訂閱者接收,當然也可以加上額外的信息,比如下面可以傳遞name:
public class TestMsg {private String name;public TestMsg(String name) {this.name = name;}public String getName() {return name;} } 復制代碼3. 定義事件接收者(Subscriber)
首先在所屬的Activity的onCreate()里面注冊
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_lib);EventBus.getDefault().register(this);} 復制代碼在onDestory里面取消注冊
@Overrideprotected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);} 復制代碼然后定義處理事件:
@Subscribe(threadMode = ThreadMode.MAIN)public void onEventMainThread(TestMsg testMsg) {if (testMsg != null) {Log.d("MainActivity", "你收到的名字為: "+testMsg.getName());}} 復制代碼這里的定義了事件接收者以及使用注解@Subscribe(threadMode = ThreadMode.MAIN)指定了執行的線程。ThreadMode有下面四種類型:
MAIN UI主線程
POSTING 默認調用方式,在調用post方法的線程執行,避免了線程切換,性能開銷最少
BACKGROUND 如果調用post方法的線程不是主線程,則直接在該線程執行。 如果是主線程,則切換到后臺單例線程,多個方法公用同個后臺線程,按順序執行,避免耗時操作
ASYNC 開辟新獨立線程,用來執行耗時操作,例如網絡訪問。
當然這里可以在注解里面設置優先級,比如下面設置優先級為100,越大就越線先接收到事件:
@Subscribe(threadMode = ThreadMode.POSTING,priority = 100)public void onEventMainThread(TestMsg testMsg) {if (testMsg != null) {Log.d("MainActivity", "你收到的名字為: "+testMsg.getName());}} 復制代碼如果你有三個接收事件,并且設置了不同的優先級,比如100、50、10,你也可以在priority = 100的接收到之后取消事件的傳遞,那么priority = 50和10的就不會接收到事件了。但是請注意,只能在ThreadMode.PostThread類型的才能取消,其他的三種ThreadMode類型是不能取消的。
如何設置:
EventBus.getDefault().cancelEventDelivery(event) ; 復制代碼4.定義事件發布者(Publisher)發出事件
sendMessage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EventBus.getDefault().post(new TestMsg("測試EventBus"));}}); 復制代碼我寫了一個小Demo,這個Demo是我在主module,也就是在app下面定義了事件接收者,在主app依賴的module下面發出事件來測試的。結果是可行的。有興趣的小伙伴可以去看下:
Demo地址
你可以通過以下方式關注我:
總結
以上是生活随笔為你收集整理的Android基础 EventBus3 0实用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win2012活动目录介绍
- 下一篇: android sina oauth2.