EventBus源码解析04-取消订阅

本文详细解析了EventBus中取消订阅的过程,通过unregister方法获取eventType集合,并遍历该集合调用unsubscribeByEventType方法,最终将指定subscriber的Subscription从subscriptions集合中移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

取消订阅会调用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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值