EventBus理解

来源:互联网 发布:魔兽争霸mac无法打开 编辑:程序博客网 时间:2024/06/14 03:49

一、使用

1.注册

EventBus.getDefault().register(this); //this指代订阅者
2.订阅者定义接收方法

public void onEventMainThread(Object event) {  //button.setText(event);  event>的类型自己定义}
3.0版本改动:通过注解来指定接收方法

@Subscribe(threadMode = ThreadMode.MainThread)public void <自己定义>(Object event) {  //button.setText(event);}

3.发送数据

EventBus.getDefault().post(result);

二、源码理解

1.注册
  register()方法中调用SubscriberMethodFinder.java类的findSubscriberMethods集合,用于获取订阅者类中所包含的接收方法(onEventMainThread/..)
register

private synchronized void register(Object subscriber, boolean sticky, int priority) {  // 找到注册者中所有的接收方法(onEventMainThread/....)  List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());  for (SubscriberMethod subscriberMethod : subscriberMethods) {    subscribe(subscriber, subscriberMethod, sticky, priority);  }}
findSubscriberMethod

for (Method method : methods) {  String methodName = method.getName();  if (methodName.startsWith(ON_EVENT_METHOD_NAME)) {    int modifiers = method.getModifiers(); // 获取方法的修饰 ,订阅者只能是public的,并且不能被final,static等修饰    if ((modifiers & Modifier.PUBLIC) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) {      Class<?>[] parameterTypes = method.getParameterTypes();      if (parameterTypes.length == 1) { // 参数类型有且只能有一个(采用bean)        String modifierString = methodName.substring(ON_EVENT_METHOD_NAME.length());        ThreadMode threadMode;        if (modifierString.length() == 0) {          threadMode = ThreadMode.PostThread;        } else if (modifierString.equals("MainThread")) {          threadMode = ThreadMode.MainThread;        } else if (modifierString.equals("BackgroundThread")) {          threadMode = ThreadMode.BackgroundThread;        } else if (modifierString.equals("Async")) {          threadMode = ThreadMode.Async;        }       


subcribe方法将获得的数据(方法名,参数类型,subscriber)封装到subscriptionsByEventType集合中


 
2.接收
  通过post(event)方法将参数even传递
  从内存中读取接收的方法名和even数据,通过反射机制执行该方法
  通过反射机制执行所要接收的方法(即onEventMainThread)




0 0
原创粉丝点击