EventBus3 0原始碼解析

2021-08-19 11:16:30 字數 1836 閱讀 3251

##eventbus的註冊

```eventbus.getdefault().register(this);

```那麼我們來看一下eventbus.getdefault(),到底做了一下什麼操作

```public static eventbus getdefault() }}

return defaultinstance;

}```

就是拿到了eventbus的例項,而且使用了雙重效驗的單例模式

然後我們再來看.register(),這個顧名思義叫做註冊,我們從原始碼來進行分析

```public void register(object subscriber) }}

```這一段**的操作,先拿到我們傳進來的class,然後subscribermethodfinder.findsubscribermethods(subscriberclass);通過名字不難看出是找到訂閱者的函式並且儲存在list中,那麼我們來看看這個函式

```listfindsubscribermethods(class<?> subscriberclass)

if (ignoregeneratedindex) else

if (subscribermethods.isempty()) else

}```

這裡做的操作先從快取訂閱者的list去取,如果有就直接返回,如果沒有繼續,來到if,ignoregeneratedindex這個引數,需要通過eventbus的構造去找,預設為false,找到這個訂閱者的method後再次存入快取的list中,那麼我們來到findusinginfo;

```private listfindusinginfo(class<?> subscriberclass)

}} else

findstate.movetosuperclass();

}return getmethodsandrelease(findstate);

}```

通過preparefindstate構造了乙個findstate,主要用來儲存訂閱者的class等等,我們也來瞅一下原始碼

```static class findstate

................省略

}```

```private subscriberinfo getsubscriberinfo(findstate findstate)

}if (subscriberinfoindexes != null) }}

return null;

}```

這裡貼了倆個方法,都是上面呼叫的,乙個是findstate,儲存了訂閱者的class,乙個

通過findstate找到subscriberinfo,不過這裡要注意,一開始的話這個subscriberinfo會返回null

也就是來到了findusingreflectioninsingleclass這個方法。

```private void findusingreflectioninsingleclass(findstate findstate) catch (throwable th)

for (method method : methods)

}} else if (strictmethodverification && method.isannotationpresent(subscribe.class))

} else if (strictmethodverification && method.isannotationpresent(subscribe.class)) }}

```在這個方法裡使用了大量的反射,對訂閱者的class進行掃瞄annotation獲得訂閱者的函式,並對其進行儲存。

EventBus3 0簡單使用

1.build.gradle新增引用 compile org.greenrobot eventbus 3.0.0 2.定義乙個事件型別 public classfirstevent publicstring getmsg 3.訂閱 解除訂閱 訂閱在oncreate中訂閱 eventbus.getde...

EventBus3 0 使用(非原創)

寫完上篇文章,這篇這心不想寫了,但是每週至少一篇的習慣不能改啊!雖然eventbus使用起來很簡單,但是種類特別多,比如他有粘性事件和非粘性事件,他們又都含有四種模式,並且還要測試在ui執行緒和非ui執行緒,所以情況很多種,廢話不多說繼續看。1 eventbus工具類,這裡為了使用方便寫了乙個簡單的...

EventBus原始碼解析(二)

那麼我們就馬上進入主題吧,上篇文章分析到boolean sticky這個引數和registersticky object subscriber 這個方法,這個方法與之前我們註冊的方法是不是很像啊?public void register object subscriber public void r...