Android事件匯流排分發庫EventBus3.0的簡單講解與實踐

來源:互聯網
上載者:User

標籤:

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的簡單講解與實踐

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.