Android 事件總線EventBus

時(shí)間:2016年5月26日15:27:46

作者:JustDo23

版本:EventBus v3.0.0

說(shuō)明:本文主要記錄本人對(duì)EventBus的使用。EventBus比較高效,簡(jiǎn)單,實(shí)用。

01. 源碼地址

首先,在github上有EventBus的源碼,官方地址為:https://github.com/greenrobot/EventBus

其次,在這里之所把github的地址單另的拿出來(lái),主要是想說(shuō)明一下上面有一個(gè)很重要的README.md文件。這個(gè)文件中有很多的使用配置介紹等等知識(shí)。這個(gè)是很有必要去仔細(xì)閱讀的。

第三,EventBus是和GreenDao使用同一個(gè)開(kāi)發(fā)者或者團(tuán)隊(duì)。

第四,給出一個(gè)類似官方文檔的地址:http://greenrobot.org/eventbus/documentation/how-to-get-started/

02. 配置Gradle

本人是在Android Studio上進(jìn)行使用的,因此在appbuild.gradle中添加依賴代碼。如果是使用Eclipse開(kāi)發(fā)可以去下載一個(gè).jar進(jìn)行使用。

compile 'org.greenrobot:eventbus:3.0.0'

03. 定義POJO實(shí)體類

EventBus其實(shí)是觀察者模式的實(shí)現(xiàn)。它的事件監(jiān)聽(tīng)與回調(diào)是基于對(duì)象的。所以在使用的時(shí)候通過(guò)自定義的JavaBean對(duì)象進(jìn)行。

/**
 * [使用EventBus]患者信息封裝
 */
public class PatientEvent {

    private String src;// 標(biāo)記來(lái)源
    private Patient patient;

    public PatientEvent(Patient patient) {
        this.patient = patient;
    }

    public Patient getPatient() {
        return patient;
    }
}

04. EventBus的注冊(cè)與解綁

廣播相比EventBus在使用的時(shí)候更簡(jiǎn)單一些。EventBus的觀察者模式需要在使用的時(shí)候進(jìn)行注冊(cè),同時(shí)需要根據(jù)生命周期及時(shí)的進(jìn)行解綁。

在使用Activity或者Fragment的時(shí)候,注冊(cè)和解綁的操作是相同的。以下是在一個(gè)Fragment中的代碼。

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().register(this);// 注意在onCreate()方法中注冊(cè)
}

@Override
public void onDestroy() {
    EventBus.getDefault().unregister(this);// 注意在onCreate()方法中注冊(cè)
    super.onDestroy();
}

05. 添加回調(diào)方法

在操作完注冊(cè)和解綁之后可以去寫相應(yīng)事件接收后的回調(diào)方法,這個(gè)是可以類比廣播的。

@Subscribe
public void onEventMainThread(PatientEvent patientEvent) {
    // 接收到事件之后的回調(diào)。參數(shù)是接收到的實(shí)體類對(duì)象。
}

在這一步的操作中,第一次看了之前定義的實(shí)體類。發(fā)送事件之后,回調(diào)方法中的參數(shù)和實(shí)體類一致的情況下,就會(huì)進(jìn)入到回調(diào)方法。否則實(shí)體類不一致,就不會(huì)進(jìn)入回調(diào)方法。

方法上邊的@Subscribe注解是必須的。在3.0版本之前可能不需要這個(gè)注解,EventBus中指定了四種必須以onEvent開(kāi)頭的方法,EventBus通過(guò)反射找到對(duì)應(yīng)的方法。然而在3.0版本中,似乎是通過(guò)了注解的方法來(lái)找到方法,注解是必須的,因此可以添加多種的方法名,只需要在方法名上指定注解就可以了。

06. 事件的發(fā)送

在以上的基礎(chǔ),沒(méi)有進(jìn)行事件的發(fā)送,所有事情都是不能夠聯(lián)系起來(lái)的,就像廣播一樣,沒(méi)有發(fā)送action的情況下,事件永遠(yuǎn)不會(huì)被觸發(fā)。

EventBus.getDefault().post(new PatientEvent(patient));

EventBus的事件發(fā)送使用的是post()方法。方法中的參數(shù)就是上邊定義的實(shí)體類。至此。對(duì)于EventBus的使用就基本完成了。

07. 更多資料

非常感謝我的大哥同事,給我提供了一個(gè)學(xué)習(xí)和了解EventBus的方向,同時(shí)還把自己寫的Demo發(fā)我進(jìn)行參考。

08. otto

另一款開(kāi)源框架ottoEventBus非常的相似,目前沒(méi)有接觸過(guò)。后期有時(shí)間可以去了解一下。

09. 自己的理解

  • 對(duì)于設(shè)計(jì)模式本人暫時(shí)沒(méi)有太多的學(xué)習(xí),這塊的空缺需要后續(xù)的不斷擴(kuò)充。
  • 關(guān)于注冊(cè)和解綁
    • 如果對(duì)觀察者模式略有研究的話,應(yīng)該不太難理解,為了進(jìn)行接口回調(diào),兩方中的一方需要持有另一方的引用。
    • 及時(shí)的解綁用來(lái)釋放引用,不然很容易造成內(nèi)存的泄露。
    • 寫到這里才突然感覺(jué)有些東西似乎弄的不太清晰,我也就呵呵了。
    • 經(jīng)常會(huì)寫動(dòng)態(tài)廣播,總是會(huì)隨手寫上注冊(cè)和解綁的代碼,可是,為什么要進(jìn)行注冊(cè)呢?
    • 注冊(cè)有點(diǎn)類似findViewById操作,可以獲取它的引用。廣播注冊(cè)相當(dāng)于系統(tǒng)可以獲取該廣播的對(duì)象,然后在收到action之后將收到的信息發(fā)給廣播(廣播接受者)。先簡(jiǎn)單的這樣理解一下吧。

10. 源碼分析資料

對(duì)于網(wǎng)上的源碼分析,有一篇值得一看:http://m.itdecent.cn/p/f057c460c77e盡量仔細(xì)閱讀一下吧,里邊提到很多的知識(shí)和獲取知識(shí)的連接。

硬著頭皮看了好幾個(gè)小時(shí),我總說(shuō)自己太Low了,差距顯而易見(jiàn)。不過(guò),不用給自己太多的負(fù)面情緒,意識(shí)的自己的實(shí)力,腳踏實(shí)地,繼續(xù)努力,繼續(xù)學(xué)習(xí),繼續(xù)進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • EventBus簡(jiǎn)介 本篇基于EventBus 2.4撰寫。 Android optimized event bu...
    MarkZhai閱讀 644評(píng)論 0 6
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • 對(duì)于Android開(kāi)發(fā)老司機(jī)來(lái)說(shuō)肯定不會(huì)陌生,它是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架,開(kāi)發(fā)者可以通過(guò)極少的代碼...
    飛揚(yáng)小米閱讀 1,547評(píng)論 0 50
  • EventBus 是一個(gè)Android端優(yōu)化的 publish/subscribe 消息總線,簡(jiǎn)化了應(yīng)用程序各個(gè)組...
    王世軍Steven閱讀 1,963評(píng)論 4 21
  • 1、Let life be beautiful like summer flowers and death lik...
    宋現(xiàn)廠閱讀 159評(píng)論 0 2

友情鏈接更多精彩內(nèi)容