EventBus理解
2016-07-24 14:16
411 查看
一、使用
1.注册
3.发送数据
二、源码理解
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)
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)
相关文章推荐
- 基于Phaser框架完成FlappyBird
- Centos7配置LAMP+xcache,rpm,php模块
- ajax
- MBG 相关资源链接
- codeforces 213B div2 The Fibonacci Segment
- SpringBoot学习笔记(4) Spring Boot 集成 Mybatis
- tjut 4928
- Java 反射
- Spark小课堂Week3 FirstSparkApp(RDD开发)
- MyBatis Generator 详解(good)
- beaglebone black教程2-使用TF卡烧写debian系统到eMMC内部
- 什么是数据库事务?
- MediaPlayer类的使用
- AndroidStudio检测不到模拟器的解决方案(百试不爽)
- 【Visual Installer】如何读取与写入注册表信息
- Catalyst揭秘 Day5 optimizer解析
- 两个数组去重合并
- [置顶] 获取缓存的大小和清除缓存
- 补题清单
- 获取Bitmap的几种方式总结