1818
1919import android .util .Log ;
2020
21- import org .simple .eventbus .handler .AsyncEventHandler ;
22- import org .simple .eventbus .handler .DefaultEventHandler ;
21+ import org .simple .eventbus .config .EventBusConfig ;
2322import org .simple .eventbus .handler .EventHandler ;
24- import org .simple .eventbus .handler . UIThreadEventHandler ;
23+ import org .simple .eventbus .matchpolicy . MatchPolicy ;
2524
2625import java .util .HashMap ;
27- import java .util .LinkedList ;
2826import java .util .List ;
2927import java .util .Map ;
3028import java .util .Queue ;
@@ -88,6 +86,10 @@ protected java.util.Queue<EventType> initialValue() {
8886 * The Default EventBus instance
8987 */
9088 private static EventBus sDefaultBus ;
89+ /**
90+ * the event bus config
91+ */
92+ private EventBusConfig mBusConfig = new EventBusConfig ();
9193
9294 /**
9395 * private Constructor
@@ -103,6 +105,7 @@ private EventBus() {
103105 */
104106 public EventBus (String desc ) {
105107 mDesc = desc ;
108+ initWithConfig (mBusConfig );
106109 }
107110
108111 /**
@@ -119,6 +122,18 @@ public static EventBus getDefault() {
119122 return sDefaultBus ;
120123 }
121124
125+ /**
126+ * init event bus with EventBusConfig
127+ *
128+ * @param config
129+ */
130+ public void initWithConfig (EventBusConfig config ) {
131+ mDispatcher .mMatchPolicy = config .getMatchPolicy ();
132+ mDispatcher .mUIThreadEventHandler = config .getUIThreadEventHandler ();
133+ mDispatcher .mPostThreadHandler = config .getPostThreadHandler ();
134+ mDispatcher .mAsyncEventHandler = config .getAsyncEventHandler ();
135+ }
136+
122137 /**
123138 * register a subscriber into the mSubcriberMap, the key is subscriber's
124139 * method's name and tag which annotated with {@see Subcriber}, the value is
@@ -216,22 +231,26 @@ private class EventDispatcher {
216231 /**
217232 * 将接收方法执行在UI线程
218233 */
219- UIThreadEventHandler mUIThreadEventHandler = new UIThreadEventHandler () ;
234+ EventHandler mUIThreadEventHandler ;
220235
221236 /**
222237 * 哪个线程执行的post,接收方法就执行在哪个线程
223238 */
224- EventHandler mPostThreadHandler = new DefaultEventHandler () ;
239+ EventHandler mPostThreadHandler ;
225240
226241 /**
227242 * 异步线程中执行订阅方法
228243 */
229- EventHandler mAsyncEventHandler = new AsyncEventHandler () ;
244+ EventHandler mAsyncEventHandler ;
230245
231246 /**
232247 * 缓存一个事件类型对应的可EventType列表
233248 */
234249 private Map <Class <?>, List <EventType >> mCacheEventTypes = new ConcurrentHashMap <Class <?>, List <EventType >>();
250+ /**
251+ * 事件匹配策略,根据策略来查找对应的EventType集合
252+ */
253+ MatchPolicy mMatchPolicy ;
235254
236255 /**
237256 * @param event
@@ -243,16 +262,34 @@ void dispatchEvents(Object aEvent) {
243262 }
244263 }
245264
265+ /**
266+ * 根据aEvent查找到所有匹配的集合,然后处理事件
267+ *
268+ * @param type
269+ * @param aEvent
270+ */
246271 private void deliveryEvent (EventType type , Object aEvent ) {
247272 Class <?> eventClass = aEvent .getClass ();
248- List <EventType > types = mCacheEventTypes .containsKey (eventClass )
249- ? mCacheEventTypes .get (eventClass )
250- : findAllEventType (eventClass , type .tag );
251- for (EventType eventType : types ) {
273+ List <EventType > eventTypes = null ;
274+ // 如果有缓存则直接从缓存中取
275+ if (mCacheEventTypes .containsKey (eventClass )) {
276+ eventTypes = mCacheEventTypes .get (eventClass );
277+ } else {
278+ eventTypes = mMatchPolicy .findMatchEventTypes (type , aEvent );
279+ mCacheEventTypes .put (eventClass , eventTypes );
280+ }
281+
282+ for (EventType eventType : eventTypes ) {
252283 handleEvent (eventType , aEvent );
253284 }
254285 }
255286
287+ /**
288+ * 处理单个事件
289+ *
290+ * @param eventType
291+ * @param aEvent
292+ */
256293 private void handleEvent (EventType eventType , Object aEvent ) {
257294 List <Subscription > subscriptions = mSubcriberMap .get (eventType );
258295 if (subscriptions == null ) {
@@ -267,44 +304,6 @@ private void handleEvent(EventType eventType, Object aEvent) {
267304 }
268305 }
269306
270- /**
271- * 根据post的参数类型来要查找该类型的所有父类、接口类型,并且构造为EventType,然后到订阅表中查找对应的接收者.
272- * 例如用户在订阅函数时参数类型设置为List
273- * <String>,但在post事件时传递的参数却是ArrayList<String>类型,此时该事件需要匹配到订阅类型为List
274- * <String>,因此需要做出处理.
275- *
276- * @param aEvent 用户发布的事件
277- * @param tag 发布的事件的tag
278- * @return
279- */
280- private List <EventType > findAllEventType (Class <?> eventClass , String tag ) {
281- List <EventType > result = new LinkedList <EventType >();
282- while (eventClass != null ) {
283- result .add (new EventType (eventClass , tag ));
284- addInterfaces (result , eventClass .getInterfaces (), tag );
285- eventClass = eventClass .getSuperclass ();
286- }
287-
288- // 缓存到map中
289- mCacheEventTypes .put (eventClass , result );
290- return result ;
291- }
292-
293- /**
294- * 获取该事件的所有接口类型
295- *
296- * @param eventTypes 存储列表
297- * @param interfaces 事件实现的所有接口
298- */
299- private void addInterfaces (List <EventType > eventTypes , Class <?>[] interfaces , String tag ) {
300- for (Class <?> interfaceClass : interfaces ) {
301- if (!eventTypes .contains (interfaceClass )) {
302- eventTypes .add (new EventType (interfaceClass , tag ));
303- addInterfaces (eventTypes , interfaceClass .getInterfaces (), tag );
304- }
305- }
306- }
307-
308307 private EventHandler getEventHandler (ThreadMode mode ) {
309308 if (mode == ThreadMode .ASYNC ) {
310309 return mAsyncEventHandler ;
0 commit comments