您的位置:首页 > 其它

EventBus源码解析04-取消订阅

2017-08-27 09:04 288 查看
取消订阅会调用
unregister()


public synchronized void unregister(Object subscriber) {
//根据subscriber获取eventType集合
List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
if (subscribedTypes != null) {
//遍历eventType集合
for (Class<?> eventType : subscribedTypes) {
unsubscribeByEventType(subscriber, eventType);
}
typesBySubscriber.remove(subscriber);
} else {
Log.w(TAG, "Subscriber to unregister was not registered before: " + subscriber.getClass());
}
}


可以看到,这里会根据subscriber获取eventType集合,再遍历这个集合逐个调用
unsubscribeByEventType


private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {
//根据eventType获取Subscription(被观察者)集合
List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
if (subscriptions != null) {
int size = subscriptions.size();
//遍历subscriptions集合
for (int i = 0; i < size; i++) {
Subscription subscription = subscriptions.get(i);
//判断subscriber是否相同
if (subscription.subscriber == subscriber) {
subscription.active = false;
//移除被观察者
subscriptions.remove(i);
i--;
size--;
}
}
}
}


这里,会根据eventType获取Subscription(被观察者)集合,在遍历subscriptions集合,找到和传入的subscriber相同的对象,将其从subscriptions集合中移除,从而取消订阅。

总结

EventBus的取消订阅主要就是根据传入的subscriber,把相应的被观察者(Subscription)从subscriptions集合(之前注册的时候所存放的集合)中移除。

final class Subscription {
//@Subscribe所在的类
final Object subscriber;
//@Subscribe注解的方法
final SubscriberMethod subscriberMethod;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息