標籤:
Android事件匯流排分發庫EventBus的簡單講解與實踐
導語,EventBus大家應該不陌生,EventBus是一款針對Android最佳化的發布/訂閱事件匯流排。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞訊息.優點是開銷小,代碼更優雅。以及將寄件者和接收者解耦。反正能協助我們快速開發,這個確實是個好東西,其實鴻洋大神已經對源碼作了一個較全面的剖析了
- Android EventBus源碼解析 帶你深入理解EventBus
我這裡就簡單的聊聊怎麼去使用和實踐了,在這裡,要感謝一下開原作者,也就是《Android源碼設計模式解析和實戰》的作者何紅輝
- 地址:https://github.com/greenrobot/EventBus
EventBus已經更新到了3.0了,也最佳化得更多好了,推薦使用3.0及以上版本,這裡先放上一張GitHub上的介紹圖
好的,我們一步步來分析這張圖
一.概念
既然是個庫,我們首先要做的,肯定是引入他的依賴了
compile ‘org.greenrobot:eventbus:3.0.0‘
如果是Eclipse,那就自行去Github上下載jar包添加到libs目錄下
- jar地址:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22
這裡我們要明白一個概念,就是事件匯流排管理,明白了事件匯流排管理,你就知道這個庫的妙用了,我們分三點來概述
- 將事件放在隊列裡,用於管理和分發
- 保證應用的各個部分之間高效的通訊及資料,事件分發
- 模組間的解耦
當然啦,這樣說可能有點籠統,我們再來分析一下,關於事件匯流排,一共四個部分
這也就迎合我們事件匯流排的思想了,訂閱者可以訂閱多個事件,發行者也發行就緒任何事件,發行者同時也可以是訂閱者,他的步驟
現在是不是對EventBus有一個大概的輪廓啦?現在我們理解這張圖就簡單多了,發行者把事件發布到匯流排裡面再進行分發
二.講解
我們按照流程來
1.註冊
//註冊 EventBus.getDefault().register(this);
一句話就註冊,當然,他裡面不光可以傳上下文,還可以傳類和事件訂閱參數
2.取消註冊
@Override protected void onDestroy() { super.onDestroy(); //取消註冊 EventBus.getDefault().unregister(this); }
取消註冊同樣的,裡面也可以和註冊一樣傳遞參數,我們後面詳細說
3.發布
發布有兩種
//直接發布,接收對象EventBus.getDefault().post("發布"); //滯留髮布EventBus.getDefault().postSticky("滯留髮布");
4.訂閱處理資料
這也是他的一個優勢的地方,在3.0之前的版本,我們是這樣的
//主線程事件處理public void onEvent(MessageEvent event) { log(event.message); }//互動式線程事件處理public void onEventMainThread(MessageEvent event) { textField.setText(event.message); }//後台線程處理public void onEventBackgroundThread(MessageEvent event) { saveToDisk(event.message); }
3.0之後,我們看官方文檔
- http://greenrobot.org/files/eventbus/javadoc/3.0/
事件處理就需要這樣使用了
/* *UserEvent需要自己定義 */ //在ui線程執行 @Subscribe(threadMode = ThreadMode.MainThread) public void onUserEvent(UserEvent event) { } //在後台線程執行 @Subscribe(threadMode = ThreadMode.BackgroundThread) public void onUserEvent(UserEvent event) { } //強制在後台執行 @Subscribe(threadMode = ThreadMode.Async) public void onUserEvent(UserEvent event) { } //預設, 在發送線程執行 @Subscribe(threadMode = ThreadMode.PostThread) public void onUserEvent(UserEvent event) { }
我們可以註解在方法名上面標記,Subscribe是訂閱者的意識,我們定義一個threadMode ,四種模式
- MainThread
- BackgroundThread
- Async
- PostThread
大意就是這樣,不知道大家理解了多少?總的來說,就是註冊了之後,就可以,比如我這邊發送一個訊息資料,你那邊就可以接收了
三,實踐
我們直接來一個小例子吧,例子也是非常的簡單,在一個地方發送一個資料訊息事件,另一個地方去接收,這個應該不難,大家都知道做,我們建立一個工程——EventBus
我們首先註冊,在把取消註冊綁定在onDestroy()上,不多說,這裡我們的主布局沒什麼東西,一個按鈕點擊發送,一個textview去接收
layout_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="15dp" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="發送事件" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textColor="@color/colorAccent" android:textSize="20sp" /></LinearLayout>
我們還需要一個實體類去儲存資料
UserEvent
package com.lgl.eventbus;/** * 實體類 * Created by lgl on 2016/5/9. */public class UserEvent { /** * 這裡你傳遞什麼類型你就寫什麼類型 */ //文本 private String text; public String getText() { return text; } public void setText(String text) { this.text = text; }}
接著,我們在Button的點擊事件中去發送我們的自訂訊息
@Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send: //發送自訂訊息 UserEvent event = new UserEvent(); event.setText("我是萌噠噠的訊息!"); EventBus.getDefault().post(event); break; } }
然後我們在主線程匯總接收這個訊息
//主線程接收訊息 @Subscribe(threadMode = ThreadMode.MAIN) public void onUserEvent(UserEvent event) { //如果多個訊息,可在實體類中添加type區分訊息 tv_content.setText(event.getText()); }
這樣一個簡單的事件訂閱,接收就完成了,我們來看一下效果
這裡我所講的可能稍微簡單點,但是EventBus真的是一個很容易上手,又強大的庫,如果細心又愛專研的同學去github上看一下,也就大概的瞭解了一個思路,我作為一個老司機,也只是拋磚引玉了
Demo下載:http://download.csdn.net/detail/qq_26787115/9514941我的群,通往Android的神奇之旅 :555974449,歡迎大家進來交流技術!
Android事件匯流排分發庫EventBus3.0的簡單講解與實踐