EventBus3.0的入門和使用

文章原文

前因

因爲公司項目中使用EventBus,所以需要進行了解,本來還以爲EventBus會很難理解,但是網上查了一下,發現上手很快,而且也沒有什麼特別難懂的地方,這篇文章記錄我對EventBus的一些理解

使用場景

經常會遇到,有時候發生了一個事件,需要在別的activity或者Fragment或者其他類中進行處理,以前我們是通過廣播去實現,但是當一個Activity需要處理很多種事件時,廣播管理起來就會麻煩很多,尤其是對於一些多線程之間的消息,用廣播和handler固然可以,但是消息過多處理起來就比較麻煩了,所以EventBus就出現了(以上純屬個人理解)

EventBus概述

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

gradle

compile 'org.greenrobot:eventbus:3.0.0'

Maven

<dependency>
    <groupId>org.greenrobot</groupId>
    <artifactId>eventbus</artifactId>
    <version>3.0.0</version>
</dependency>
基本使用

1、首先每個事件寫一個實體bean,EventBus就是根據這個實體bean來判斷事件分發的

public class EventBusBean{
}

就創建一個空類就可以,當然如果需要通過消息傳遞什麼對象,那個對象的類就是這個類文件
2、在要接受消息的頁面註冊EventBus

EventBus.getDefault().register(this);  

3、實現處理方法
在3.0以前一直是通過以下4個方法名來實現消息處理

a、onEvent
b、onEventMainThread
c、onEventBackgroundThread
d、onEventAsync
每個方法名都有不同的含義

onEvent:如果使用onEvent作爲訂閱方法,那麼該事件在哪個線程發佈出來的,onEvent就會在這個線程中運行,也就是說發佈事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。

onEventMainThread:如果使用onEventMainThread作爲訂閱方法,那麼不論事件是在哪個線程中發佈出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,這個在Android中是非常有用的,因爲在Android中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。

onEventBackground:如果使用onEventBackgrond作爲訂閱方法,那麼如果事件是在UI線程中發佈出來的,那麼onEventBackground就會在子線程中運行,如果事件本來就是子線程中發佈出來的,那麼onEventBackground函數直接在該子線程中執行。

onEventAsync:使用這個函數作爲訂閱方法,那麼無論事件在哪個線程發佈,都會創建新的子線程在執行onEventAsync.
實現處理方法有4個方法可以實現,不用繼承或實現任何接口,只需要在你註冊的類中添加方法就行了,當然方法名是有限制的,參數就是你要傳遞的消息對象

==但是3.0以後就不在用這種方式了,而是通過註解的方式==

通過註解@Subscribe來確定實現的方法,當然還需要方法的形參,只是把以前的特定方法名改爲不特定,而是通過註解,同時通過threadMode來設定線程,一共有4種方式,同以前一樣

a、ThreadMode.POSTING 同onEvent
b、ThreadMode.MAIN 同onEventMainThread
c、ThreadMode.BACKGROUND 同onEventBackground
d、ThreadMode.ASYNC 同onEventAsync
如:@Subscribe(threadMode = ThreadMode.POSTING)

比如我們用onEventMainThread來註冊,這樣onEventMainThread方法體會在UI線程去執行

public void onEventMainThread(EventBusBean bean){
...
}

4、發送消息

EventBus.getDefault().post(new EventBusBean());

或者

//postSticky 發送粘性消息,同粘性廣播相同,發送後會保存,在後面註冊的也能接收到
EventBus.getDefault().postSticky(new EventBusBean());

5、取消註冊
當一個類被銷燬或者生命週期完成時,我們要及時取消註冊,以免造成內存泄露

EventBus.getDefault().unregister(this);

以下鏈接是我寫的一個關於EventBus3.0的demo,有興趣可以去看看

EventBus3.0Demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章