Android開源庫——EventBus使用教程

前言

EventBus這個開源庫相信很多Android開發(fā)者都用過瓮顽,它是greenrobot出產的垛贤,greenrobot的厲害就不用我多說了吧,它還出產過比較出名的數據庫操作開源庫greenDAO趣倾。
Android傳統(tǒng)的消息傳遞方式一般是通過Intent、Handler某饰、BroadcastReceiver等等來進行的儒恋,這些方式也算是簡單易用,但也有許多缺點黔漂,比如說在進行消息傳遞時需要寫大量的模板代碼诫尽,代碼耦合度高,而EventBus的誕生就完美解決了這些問題炬守,它的原理是發(fā)送事件到事件總線牧嫉,然后根據事件類型來匹配相應訂閱者的訂閱方法,用一張圖簡單說明

EventBus原理圖

簡單列舉一下它的優(yōu)點

  • 簡單有效:簡單兩句代碼就可以實現(xiàn)事件傳遞功能,并且訂閱者不知道發(fā)送者是誰酣藻,降低耦合
  • 高性能:EvnetBus針對Android平臺進行了優(yōu)化
  • 注解:通過@Subscribe注解訂閱方法曹洽,同時避免了非常耗時的運行時注解反射
  • 線程:主線程和后臺線程都可以傳遞事件

這一篇就主要講解EventBus的基本使用方式,比較簡單辽剧,下一篇講解EventBus的高級用法

使用方式

依賴

項目中依賴EventBus庫送淆,這里通過gradle依賴的方式,使用的是最新版本

compile 'org.greenrobot:eventbus:3.1.1'

想要了解詳細的使用方式和官方文檔怕轿,請看EventBus的Github偷崩,傳送門:https://github.com/greenrobot/EventBus

實現(xiàn)步驟

使用方式非常簡單,可分為三點

  1. 需要接受事件的頁面注冊EventBus
  2. 通過EventBus發(fā)送事件撞羽,相關頁面接收事件并處理
  3. 頁面銷毀阐斜,反注冊EventBus

代碼實現(xiàn)

先來看一下實現(xiàn)效果


實現(xiàn)效果

注冊

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = findViewById(R.id.tv);
    findViewById(R.id.btn_jump).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });

    // 注冊該頁面為訂閱者
    EventBus.getDefault().register(this);
}

設置按鈕監(jiān)聽,點擊跳轉诀紊,最后一句注冊該頁面為訂閱者谒出,看一下訂閱方法

@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateUIEvent(UpdateUIEvent updateUIEvent) {
    mTextView.setText("陳奕迅只有一個");
}

在MainActivity定義一個方法,通過@Subscribe注解訂閱方法渡紫,接收UpdateUIEvent作為參數到推,意思是,在該頁面注冊成為訂閱者之后惕澎,當別處發(fā)送UupdateUIEvent事件時莉测,這個訂閱方法就會接收到事件并處理,此處的做法是更新TextView顯示的文本唧喉。UpdateUIEvent是自定義的一個事件類捣卤,名字可以隨便起,threadMode表示訂閱事件運行在哪個線程八孝,這里指定主線程董朝。

發(fā)送事件

點擊跳轉之后,來到SecondActivity干跛,看代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(SecondActivity.this, "滋醒你~~~", Toast.LENGTH_SHORT).show();
            // 發(fā)送事件
            EventBus.getDefault().post(new UpdateUIEvent());
        }
    });
}

設置按鈕監(jiān)聽子姜,onClick方法里post一個事件,該事件正是UpdateUIEvent楼入,這也意味著MainActivity的訂閱方法onUpdateUIEvent(UpdateUIEvent)會接收到該事件哥捕,結合圖來看確實是如此。

反注冊

當銷毀頁面時嘉熊,也就意味著該頁面不需要再接收事件遥赚,可以在onDestroy中反注冊EventBus

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

到這里可能很多人會問:實際的開發(fā)中有哪些場景是適合用EventBus來實現(xiàn)的呢,我舉個簡單地例子:比如說一開始用戶未登錄阐肤,而當用戶登錄時凫佛,需要更新非前臺頁面的一些頁面信息讲坎,以便在用戶在返回這些頁面時立馬看到更新的效果,這時候可以使用EventBus來進行post更新事件達到靜默更新的效果愧薛。

最后附上完整源碼晨炕,xml就不貼了
MainActivity:

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.tv);
        findViewById(R.id.btn_jump).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });

        // 注冊該頁面為訂閱者
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onUpdateUIEvent(UpdateUIEvent updateUIEvent) {
        mTextView.setText("陳奕迅只有一個");
    }
}

SecondActivity:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(SecondActivity.this, "滋醒你~~~", Toast.LENGTH_SHORT).show();
                // 發(fā)送事件
                EventBus.getDefault().post(new UpdateUIEvent());
            }
        });
    }
}

總結

好了,基本使用大致如上厚满,非常簡單府瞄,相信大部分同學都用過了,沒用過的同學看了之后應該也有個大致的了解了碘箍。下一篇來點有意思的遵馆,講解EventBus的高級用法
下一篇:Android開源庫——EventBus高級用法

歡迎關注

個人微信公眾號:Charming寫字的地方

Github:https://github.com/CharmingWhttps://github.com/CharmingW

感謝閱讀!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末丰榴,一起剝皮案震驚了整個濱河市货邓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌四濒,老刑警劉巖换况,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盗蟆,居然都是意外死亡戈二,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門喳资,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉吭,“玉大人,你說我怎么就攤上這事仆邓∠侍玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵节值,是天一觀的道長徙硅。 經常有香客問我,道長搞疗,這世上最難降的妖魔是什么嗓蘑? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匿乃,結果婚禮上脐往,老公的妹妹穿的比我還像新娘。我一直安慰自己扳埂,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布瘤礁。 她就那樣靜靜地躺著阳懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岩调,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天巷燥,我揣著相機與錄音,去河邊找鬼号枕。 笑死缰揪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的葱淳。 我是一名探鬼主播钝腺,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赞厕!你這毒婦竟也來了艳狐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤皿桑,失蹤者是張志新(化名)和其女友劉穎毫目,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體诲侮,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡镀虐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沟绪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刮便。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖近零,靈堂內的尸體忽然破棺而出诺核,到底是詐尸還是另有隱情,我是刑警寧澤久信,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布窖杀,位于F島的核電站,受9級特大地震影響裙士,放射性物質發(fā)生泄漏入客。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一腿椎、第九天 我趴在偏房一處隱蔽的房頂上張望桌硫。 院中可真熱鬧,春花似錦啃炸、人聲如沸铆隘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膀钠。三九已至掏湾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肿嘲,已是汗流浹背融击。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雳窟,地道東北人尊浪。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像封救,于是被迫代替她去往敵國和親拇涤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353