Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android EventBus的初步使用

Android EventBus的初步使用

編輯:關於Android編程

 

 

項目使用的技術呢,說白了,就是將要傳遞的event(一個Object對象,可任意自定義),發送到公共的組件EventBus中進行存儲,

在通過EventBus傳遞給訂閱者(使用者),訂閱者收到event消息,就可以自行處理了。

 

不要被標題迷惑了,其實在任何地方 都可以發送和接收event(event,是一個通稱,表示任意的數據對象,是一個消息類型)。

當然有需要注意的地方了,往下看吧。

 

分析一個基本的使用流程:

 

1. 自定義一個event類型:需要什麼樣的數據,就定義成什麼樣,隨意了

 

2. 確定在哪裡來接收該event,就在哪裡調用EventBus.getDefault().register()進行訂閱者的注冊。

EventBus 一看就是個單例類,所以通過它存儲、發送event。

register()有多個重載方法:

 

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. public void register(Object subscriber) {
  2. register(subscriber, false, 0);
  3. }
  4.  
  5. public void register(Object subscriber, int priority) {
  6. register(subscriber, false, priority);
  7. }
  8.  
  9. public void registerSticky(Object subscriber) {
  10. register(subscriber, true, 0);
  11. }
  12.  
  13. public void registerSticky(Object subscriber, int priority) {
  14. register(subscriber, true, priority);
  15. }
  16. private void subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority) {
  17. ...
  18. }

    看名字也很好理解,subscriber即訂閱者(接收處理event的類);priority即優先級,表示優先處理;

    sticky粘性的意思,在源碼中會有一個map對象,來存儲sticky的event,

    因為map的key是onEvent...()方法的第一個參數類型,

    一般呢,這第一個參數就是訂閱者對象,所以map會存儲該類型的最後一次發送的event對象。

    這些register都會最終調用一個私有register方法實現的,在這個方法裡有個參數是SubscriberMethod對象。

    調用subscriberMethod.findSubscriberMethods(), 查找到訂閱者定義的接收處理event的方法,

    並在EventBus中存起來。

     

    3. 在訂閱者中定義接收處理event的方法,約定為:

    onEvent、onEventMainThread、onEventBackgroundThread、onEventAsync

    使用時類似這樣的:public void onEvent(Object event)。 onEvent對應PostThread,其他各自對應ThreadMode中的其他定義。

    onEvent後面跟的這些名稱的意義,見ThreadMode

     

     

    4. 發送事件

     

    調用EventBus.getDefault().post(Object event),發送事件

    源碼中會調用postToSubscription(),發送event給對應的訂閱者方法

     

    ThreadMode

    這是一個枚舉類。定義了四種類型:PostThread、MainThread、BackgroundThread、Async

    PostThread 事件event的處理和發送都在相同線程中

    MainThread 事件event的處理在主線程中,小心ANR

    BackgroundThread 事件event的處理在後台線程中,它是阻塞式的,如有多個事件發送過來,會一個一個處理

    Async 事件event的處理是異步的,即新開一個線程進行處理。

     

    簡單使用

     

    (1)自定義一個類,可以是空類,比如:

    [java] view plaincopy在CODE上查看代碼片派生到我的代碼片
    1. public class AnyEventType {
    2. public AnyEventType(){}
    3. }

       

      (2)在要接收消息的頁面注冊:

      [java] view plaincopy在CODE上查看代碼片派生到我的代碼片
      1. eventBus.register(this);

         

        (3)發送消息

         

        [java] view plaincopy在CODE上查看代碼片派生到我的代碼片
        1. eventBus.post(new AnyEventType event);

          (4)接受消息的頁面實現(共有四個函數,各功能不同,這是其中之一,可以選擇性的實現,這裡先實現一個):

           

          [java] view plaincopy在CODE上查看代碼片派生到我的代碼片
          1. public void onEvent(AnyEventType event) {} (5)解除注冊
            [java] view plaincopy在CODE上查看代碼片派生到我的代碼片
            1. eventBus.unregister(this); 順序就是這樣,下面舉個例子來說明下:

              請參考 http://blog.csdn.net/harvic880925/article/details/40660137

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