EventBus是一个基于观察者模式的一个开源框架,我这里从两个入口分析源码,一个是EventBus.getDefaut().register(),一个是EventBus.getDefaut().post(new Event()),
分两篇文章分析。
注意:下面的代码EventBus是3.1.1版本的
compile
'org.greenrobot:eventbus:3.1.1'
我们可以在MainActivity的onCreate中执行EventBus.getDefault().regitser(this),在onDestroy中执行unregister(this),另外还需要一个注解@Subscribe下定义一个方法
代码如下:
private Button secondAcitivity;
private TextView showTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
secondAcitivity = (Button) findViewById(R.id.secondAcitivity);
showTv = (TextView) findViewById(R.id.showTv);
secondAcitivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onClick(ClickEvent event){
showTv.setText("clicked....");
}
再创建一个SecondActivity,在页面中放一个按钮,点击按钮时执行post,代码如下
button
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick
(View v) {
EventBus.
getDefault
().post(
new
ClickEvent())
;
}
})
;
下面从入口EventBus.getDefault().register(this) 开始分析
先看getDefault()
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
可以看到这里用了一个double-check-lock方式的单例模式
再看register方法
public void register(Object subscriber) {
Class<?> subscriberClass = subscriber.getClass();
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
register的就是建立订阅关系的过程,订阅者(观察者)就是MainActivity
通过反射拿到注解 Subscription的下方法Method
下面看建立订阅的方法subscribe
// Must be called in synchronized block
private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
Class<?> eventType = subscriberMethod.eventType;
Subscription newSubscription = new Subscription(subscriber, subscriberMethod);
CopyOnWriteArrayList<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
if (subscriptions == null) {
subscriptions = new CopyOnWriteArrayList<>();
subscriptionsByEventType.put(eventType, subscriptions);
} else {
if (subscriptions.contains(newSubscription)) {
throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event "
+ eventType);
}
}
int size = subscriptions.size();
for (int i = 0; i <= size; i++) {
if (i == size || subscriberMethod.priority > subscriptions.get(i).subscriberMethod.priority) {
subscriptions.add(i, newSubscription);
break;
}
}
List<Class<?>> subscribedEvents = typesBySubscriber.get(subscriber);
if (subscribedEvents == null) {
subscribedEvents = new ArrayList<>();
typesBySubscriber.put(subscriber, subscribedEvents);
}
subscribedEvents.add(eventType);
if (subscriberMethod.sticky) {
if (eventInheritance) {
// Existing sticky events of all subclasses of eventType have to be considered.
// Note: Iterating over all events may be inefficient with lots of sticky events,
// thus data structure should be changed to allow a more efficient lookup
// (e.g. an additional map storing sub classes of super classes: Class -> List<Class>).
Set<Map.Entry<Class<?>, Object>> entries = stickyEvents.entrySet();
for (Map.Entry<Class<?>, Object> entry : entries) {
Class<?> candidateEventType = entry.getKey();
if (eventType.isAssignableFrom(candidateEventType)) {
Object stickyEvent = entry.getValue();
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
} else {
Object stickyEvent = stickyEvents.get(eventType);
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
}
一个EvnetType可以有多个Subscriber(订阅者)
可参考学习的地方:用ConcurrentHashMap做缓存