Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android事件總線分發庫EventBus3.0的簡單講解與實踐

Android事件總線分發庫EventBus3.0的簡單講解與實踐

編輯:關於Android編程

 

導語,EventBus大家應該不陌生,EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。反正能幫助我們快速開發,這個確實是個好東西

地址:https://github.com/greenrobot/EventBus
我這裡就簡單的聊聊怎麼去使用和實踐了,在這裡,要感謝一下開原作者,也就是《Android源碼設計模式解析和實戰》的作者何紅輝

EventBus已經更新到了3.0了,也優化得更多好了,推薦使用3.0及以上版本,這裡先放上一張GitHub上的介紹圖

這裡寫圖片描述

好的,我們一步步來分析這張圖

一.概念

既然是個庫,我們首先要做的,肯定是引入他的依賴了

 compile 'org.greenrobot:eventbus:3.0.0'

如果是Eclipse,那就自行去Github上下載jar包添加到libs目錄下

這裡我們要明白一個概念,就是事件總線管理,明白了事件總線管理,你就知道這個庫的妙用了,我們分三點來概述

將事件放在隊列裡,用於管理和分發 保證應用的各個部分之間高效的通信及數據,事件分發 模塊間的解耦

當然啦,這樣說可能有點籠統,我們再來分析一下,關於事件總線,一共四個部分

發布者 訂閱者 事件 總線

這也就迎合我們事件總線的思想了,訂閱者可以訂閱多個事件,發布者也可以發布任何事件,發布者同時也可以是訂閱者,他的步驟

訂閱 注冊 發布 取消注冊

現在是不是對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之後,我們看官方文檔

https://github.com/greenrobot/EventBus/blob/master/HOWTO.md#delivery-threads-and-threadmodes

事件處理就需要這樣使用了

   /*
    *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去接收<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxoMyBpZD0="layoutmainxml">layout_main.xml




    

我們還需要一個實體類去保存數據

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上看一下,也就大概的了解了一個思路,我作為一個老司機,也只是拋磚引玉了

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved