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