EventBus源码---sticky属性探究

本文主要解析EventBus的粘性特征,从postSticky和register两方面展开。postSticky将粘性事件存于stickyEvents并调用post方法发送事件;register中若@Subscribe设置了sticky属性,会执行相关代码,粘性事件在register时就已发送,代码和思想都较简单。

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

EventBus的粘性特征,我之前并没有看过它的流程代码,以为会略微复杂一点,今天看一下,发现原来是我想多了,真的是简单到没必要说的那种,不过毕竟之前说了之后来讲,那就简单说一下吧。

关于粘性特征,从以下几个地方去说:postSticky,register

postSticky

我们看一下这个方法的源码
 

    public void postSticky(Object event) {
        synchronized (stickyEvents) {
            stickyEvents.put(event.getClass(), event);
        }
        // Should be posted after it is putted, in case the subscriber wants to remove immediately
        post(event);
    }

把粘性的事件,存放到了stickyEvents中。然后调用post方法,这个方法在EventBus源码---post流程分析说过,就是发送事件的操作,也就是说,粘性事件和普通事件一样,都发送事件出去。

postSticky之后,就到了register操作,我们看一下register中关于sticky的处理

register

我们查看subscribe方法中的一段代码

        if (subscriberMethod.sticky) {
            if (eventInheritance) {
                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);
            }
        }

如果@Subscribe中设置了sticky属性,那么会执行上面的代码。首先先判断eventInheritance属性,这个属性在EventBus源码---post流程分析也说过,作用一样,我就不再这里赘述了。我们直接进入checkPostStickyEventToSubscription方法

    private void checkPostStickyEventToSubscription(Subscription newSubscription, Object stickyEvent) {
        if (stickyEvent != null) {
            // If the subscriber is trying to abort the event, it will fail (event is not tracked in posting state)
            // --> Strange corner case, which we don't take care of here.
            postToSubscription(newSubscription, stickyEvent, isMainThread());
        }
    }

postToSubscription方法大家应该不陌生,在post方法调用的时候这个方法有被调用。而粘性事件,在register的时候就已经把事件发送出去了。

 

其实以上就是粘性事件的代码了,很简单,思想也不难,有问题欢迎留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值