EventBus學習記錄

一、概念



什麼是EventBus

EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。

簡而言之,EventBus其實就是一個通信的中介
EventBus是一個消息總線,以觀察者模式實現,用於簡化程序的組件、線程通信,可以輕易切換線程、開闢線程。EventBus3.0跟先前版本的區別在於加入了annotation @Subscribe,取代了以前約定命名的方式。



二、事件


EventBus使用幾種不同的事件來進行不同模塊和不同進程之間的信息交換

  • ThreadMode.POSTING默認的方式,在post方法的線程執行。

  • ThreadMode.MAIN: 在主線程執行

  • ThreadMode.BACKGROUND: 如果post方法不是主線程,直接在該線程執行,如果是主線程就切換到後臺執行

  • ThreadMode.ASYNC: 開闢獨立線程,內部使用來線程池,併發執行限制數量


三、使用


將其分成三步來執行(創建Message)(發送端代碼)(接收端代碼)

1、如下是Message類的創建,也就是一個基本的EventBus數據的傳輸單位
public class MessageEvent {

    public String name;

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

2、如下是發送端的代碼,通過post的方式來進行發送,發送端和接收端可以在不同的組件和不同的線程中
public class EventBusSendActivity extends Activity {
    private TextView tv_title;
    private Button bt_eventbus_send_main;
    private TextView tv_eventbus_send_result;

    boolean isFirstFlag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_event_bus_send);

        initView();

        initData();

        initListener();
    }

    private void initListener() {
        // 主線程發送數據按鈕點擊事件處理
        bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 4 發送消息
                EventBus.getDefault().post(new MessageEvent("主線程發送過來的數據"));

                // 結束當前頁面
                finish();
            }
        });

    }


    // 3 接收粘性事件
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void StickyEventBus(StickyEvent event){
        // 顯示接收的數據
        tv_eventbus_send_result.setText(event.msg);
    }

    private void initData() {
        tv_title.setText("EventBus發送數據頁面");
    }

    private void initView() {
        tv_title = (TextView)findViewById(R.id.tv_title);
        bt_eventbus_send_main = (Button)findViewById(R.id.bt_eventbus_send_main);
        bt_eventbus_send_sticky = (Button)findViewById(R.id.bt_eventbus_send_sticky);
        tv_eventbus_send_result = (TextView)findViewById(R.id.tv_eventbus_send_result);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 5 解註冊
        EventBus.getDefault().removeAllStickyEvents();
        EventBus.getDefault().unregister(EventBusSendActivity.this);
    }
}

3、如下是接收端的代碼,通過註解的方式來進行接收的,可以看到在進行接收之前都是要進行先註冊的
public class EventBusActivity extends Activity {
    private TextView tv_title;
    private Button bt_eventbus_send;
    private TextView tv_eventbus_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_event_bus);

        initView();

        initData();

        initListener();
    }

    private void initListener() {
        // 跳轉到發送頁面
        bt_eventbus_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);

                startActivity(intent);
            }
        });

    }

    private void initData() {
        tv_title.setText("EventBus");

        //註冊廣播
        EventBus.getDefault().register(EventBusActivity.this);
    }

    private void initView() {
        tv_title = (TextView)findViewById(R.id.tv_title);

        bt_eventbus_send = (Button)findViewById(R.id.bt_eventbus_send);
        tv_eventbus_result = (TextView)findViewById(R.id.tv_eventbus_result);
    }


    // 接收消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void MesssageEventBus(MessageEvent event){

        // 顯示接收的消息
        tv_eventbus_result.setText(event.name);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 2 解註冊
        EventBus.getDefault().unregister(EventBusActivity.this);
    }
}
另外還有一種粘性事件的方式,就是先進行接收然後再註冊,什麼時候註冊什麼時候接收,不註冊就一直在內存中


四、原理


(一)註冊原理

(1)因爲註冊實在接收端進行註冊,所以接收端就是訂閱者,而發送端就是發佈者,發佈者和訂閱者之間是通過調度中心來盡心工作的,查找訂閱者所有事件相應函數。
(2)循環每個事件相應函數,得到該事件的所有訂閱者信息,將其插入訂閱者的隊列中

(二)發送原理


(1)也就是一個Post的流程,得到當前線程的post信息及隊列

(2)將當前事件添加到當前線程的事件隊列
(3)循環事件隊列中的每個事件
(4)找到對應事件的訂閱者




尊重作者,尊重原創,參考文章:
http://www.jianshu.com/p/7007b07c05d6
發佈了228 篇原創文章 · 獲贊 45 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章