版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiey94/article/details/82941872
EventBus 普通事件的unregister
/** Unregisters the given subscriber from all event classes. */
public synchronized void unregister(Object subscriber) {
List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
if (subscribedTypes != null) {
for (Class<?> eventType : subscribedTypes) {
unsubscribeByEventType(subscriber, eventType);
}
typesBySubscriber.remove(subscriber);
} else {
logger.log(Level.WARNING, "Subscriber to unregister was not registered before: " + subscriber.getClass());
}
}
根据订阅者找到所有的订阅类型,如果找不到则抛异常,你咋没注册呢?
找到之后则遍历所有的参数类型进行取消订阅处理;
unsubscribeByEventType(subscriber, eventType);
并在map中删除该订阅者(也就是typesBySubscriber,typesBySubscriber是啥?看名字,订阅者作为Key,订阅者中所有的订阅方法的参数类型装载的List作为Value)
/** Only updates subscriptionsByEventType, not typesBySubscriber! Caller must update typesBySubscriber. */
private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {
List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
if (subscriptions != null) {
int size = subscriptions.size();
for (int i = 0; i < size; i++) {
Subscription subscription = subscriptions.get(i);
if (subscription.subscriber == subscriber) {
subscription.active = false;
subscriptions.remove(i);
i--;
size--;
}
}
}
}
根据参数类型,找到所有的订阅者方法;然后找出是当前订阅者的订阅者方法,将订阅者方法设置为解注册,同时从该参数类型的所有订阅者方法的List中移除属于该订阅者的订阅者方法;
啥叫订阅者方法(订阅者subscriber+subscriberMethod组装的Subscription,Subscription就是我取名的订阅者方法);