天天看點

Android事件總線分發庫的使用EventBus(和Otto一樣,隻是效率高點)

Event Bus是一個釋出 / 訂閱的事件總線。

Event Bus模式 — 也被稱為Message Bus或者釋出者/訂閱者(publisher/subscriber)模式 

— 可以讓兩個元件互相通信,但是他們之間并不互相知曉。

基于事件總線管理/訂閱/分發模式的。事件響應有更多的線程選擇,

EventBus可以向不同的線程中釋出事件。EventBus支援 Sticky Event。

使用時需要先注冊訂閱,然後向訂閱者分發消息資料即可。

包含4個成分:釋出者,訂閱者,事件,總線。訂閱者可以訂閱多個事件,

發送者可以釋出任何事件,釋出者同時也可以是訂閱者。分訂閱、注冊、釋出、取消注冊等步驟。

Event Bus的基本用法

       分訂閱、注冊、釋出、取消注冊。

       注冊:

EventBus.getDefault().register(this); 

EventBus.getDefault().register(new MyClass()); 

//注冊:三個參數分别是,消息訂閱者(接收者),接收方法名,事件類

        EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);

取消注冊: 

        EventBus.getDefault().unregister(this);

  EventBus.getDefault().unregister(new MyClass());

訂閱處理資料:

public void onEventMainThread{}

        public void onEvent(AnyEventType event) {}

onEventPostThread、onEventBackgroundThread、onEventAsync

釋出: 

EventBus.getDefault().postSticky(new SecondActivityEvent("Message From SecondActivity"));

  EventBus.getDefault().post(new ChangeImgEvent(1)); 

下面是一個例子:

1導jar包

2核心代碼:

一、基本用法

發消息:

EventBus.getDefault().post(new Zhh("消息FourActivity"));
           

其他頁面接收消息

/**
     * 在 onCreate 中注冊
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        EventBus.getDefault().register(this);
    }

    /**
     * 在 onDestroy 中取消注冊
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
    
    /**
     * 接收消息
     * 注意eventbus3.0的jar包要加@Subscribe
     */
    @Subscribe
    public void  onEvent(Zhh zhh){
        Logger.t("111").d("接收到的消息是"+zhh.getName());
    }
           

實體類

package com.zhh.android;

/**
 * 實體類
 */

public class Zhh {
    private String name;

    public Zhh(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}
           

二、Sticky Event - 粘性事件

        在Android開發中,Sticky事件隻指事件消費者在事件釋出之後才注冊的也能接收到該事件的特殊類型。Android中就有這樣的執行個體,也就是Sticky Broadcast,即粘性廣播。正常情況下如果發送者發送了某個廣播,而接收者在這個廣播發送後才注冊自己的Receiver,這時接收者便 無法接收到剛才的廣播,為此Android引入了StickyBroadcast,在廣播發送結束後會儲存剛剛發送的廣播(Intent),這樣當接收者注冊完Receiver 後就可以接收到剛才已經釋出的廣播。這就使得我們可以預先處理一些事件,讓有消費者時再把這些事件投遞給消費者。

發消息:

EventBus.getDefault().postSticky("首頁消息");
           

接收消息

/**
     * 在onCreate 注冊
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        EventBus.getDefault().register(this);
    }

    /**
     * 在onDestroy中取消注冊
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    /**
     * 接收消息
     */
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onEvent(String zifuchuan) {
        TextView textView = findViewById(R.id.textView);
        textView.setText(zifuchuan);
    }
           

三、線程模式 ThreadMode

消息在那個線程中接收

常用的兩個:ThreadMode.MAIN主線程,ThreadMode.ASYNC子線程

在子線程中接收(在注解中辨別)

/**
     * 接收消息
     * 注意eventbus3.0的jar包要加@Subscribe
     */
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void  onEvent(Zhh zhh){
        Logger.t("111").d("接收到的消息是"+zhh.getName());
    }
           

在主線程中接收(在注解中辨別)

/**
     * 接收消息
     * 注意eventbus3.0的jar包要加@Subscribe
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void  onEvent(Zhh zhh){
        Logger.t("111").d("接收到的消息是"+zhh.getName());
    }
           

源碼下載下傳:

http://download.csdn.net/detail/zhaihaohao1/9563601

EventBus實作fragment之間傳遞資料

http://download.csdn.net/detail/zhaihaohao1/9563663

參考文章:

https://blog.csdn.net/IO_Field/article/details/52185717

繼續閱讀