##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...