Eventbus 学习完毕后的总结

EventBus方法:
onEventMainThread(发送时实参类型)
将接收到的数据,在主线程中执行


onEventPostThread(发送时实参类型)
将接收到的数据,在发送时的线程中进行执行


onEventAsync(发送时实参类型)
将接收到的数据,直接放在线程池中进行执行


onEventBackGroundThread(发送时实参类型)

将接收到的数据,如果发送时在非UI线程中,则直接在发送线程中执行,否则在线程池中一个接一个执行


EventBus.default():
实际上就是一个单利,创建对象的过程,使用了双if判断以及同步锁,防止并发访问

public static EventBus getDefault() {
        if(defaultInstance == null) {
            Class var0 = EventBus.class;
            synchronized(EventBus.class) {
                if(defaultInstance == null) {
                    defaultInstance = new EventBus();
                }
            }
        }

        return defaultInstance;
    }

EventBus.default().register():
实际上不管是几个参数的register调用的都是同一个,去匹配类中符合EventBus命名规则的方法

private synchronized void register(Object subscriber, boolean sticky, int priority) {
			//findSubscriberMethods这个方法就是去匹配方法 封装进map
			List subscriberMethods = this.subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
		
			//所有方法都去调用subscribe方法
			Iterator i$ = subscriberMethods.iterator();
			
			while(i$.hasNext()) {
			    SubscriberMethod subscriberMethod = (SubscriberMethod)i$.next();
			    this.subscribe(subscriber, subscriberMethod, sticky, priority);
			}

		    }
findSubscriberMethods:

在调用这个方法的时候去使用传过来的当前类.class , 调用getMethod方法得到当前类中所有的方法,然后开始遍历
判断是否是onEvent开头,是否是public修饰,是否非static或者abstract修饰的方法,是否只有一个实参,满足上述所有
条件才进入到封装部分,根据方法名的结尾是否以MainThread或PostThread或Async或BackGroundThread结尾如果不以这四个
其中一个结尾则continue跳出当前循环,进行下一次循环,如果都不匹配则抛异常。匹配上之后根据不同的后缀设置不同的ThreadMode(执行的线程的模式)
在方法匹配完毕的时候获取方法中实参的数据类型 eventType,最后将方法method,threadMode,eventType存入名叫subscriberMethods(在下面方法中这个方 法名叫var23)(订阅者方法)的List集合中
然后返回

List<SubscriberMethod> findSubscriberMethods(Class<?> subscriberClass) {
		String key = subscriberClass.getName();
		Map clazz = methodCache;
		List subscriberMethods;
		synchronized(methodCache) {
		<span style="white-space:pre">	</span>//对于methodCache这个集合 我的理解是所有被register的类 类名做键,类中的所有onEvent开头的方法放进一个List集合做值 都存储在这个集合里面
		<span style="white-space:pre">	</span>//那么这段代码显而易见,就是你注册的这个类中存储着所有onEvent开头的方法的集合  
		<span style="white-space:pre">	</span>//而事实上一个被注册的类中的所有onEvent方法都在subscriberMethods里面
		<span style="white-space:pre">	</span>subscriberMethods = (List)methodCache.get(key);
		}
					
		//判断通过类名获取到的装着onEvent方法的集合是否为空,如果不为空,那么就是封装过了 直接返回
		if(subscriberMethods != nul
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值