EventBusManager.java
3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.studymachine.www.manager;
import androidx.collection.ArrayMap;
import com.studymachine.www.MyEventBusIndex;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.greenrobot.eventbus.meta.SubscriberInfoIndex;
/**
* EventBus 管理类
*/
public final class EventBusManager {
/** EventBus 索引类 */
private static final SubscriberInfoIndex SUBSCRIBE_INDEX = new MyEventBusIndex();
/** 这个类是否需要注册 EventBus */
private static final ArrayMap<String, Boolean> SUBSCRIBE_EVENT = new ArrayMap<>();
/** 不允许被外部实例化 */
private EventBusManager() {}
/**
* 初始化 EventBus
*/
public static void init() {
EventBus.builder()
// 使用 Apt 插件
.ignoreGeneratedIndex(false)
// 添加索引类
.addIndex(SUBSCRIBE_INDEX)
// 作为默认配置
.installDefaultEventBus();
}
/**
* 注册 EventBus
*/
public static void register(Object subscriber) {
if (canSubscribeEvent(subscriber)) {
EventBus.getDefault().register(subscriber);
}
}
/**
* 反注册 EventBus
*/
public static void unregister(Object subscriber) {
if (canSubscribeEvent(subscriber) && EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().unregister(subscriber);
}
}
/**
* 判断是否使用了 EventBus 注解
*
* @param subscriber 被订阅的类
*/
private static boolean canSubscribeEvent(Object subscriber) {
Class<?> clazz = subscriber.getClass();
// 这个 Class 类型有没有遍历过
Boolean result = SUBSCRIBE_EVENT.get(clazz.getName());
if (result != null) {
// 有的话直接返回结果
return result;
}
// 没有的话进行遍历
while (clazz != null) {
// 如果索引集合中有这个 Class 类型的订阅信息,则这个类型的对象都需要注册 EventBus
if (SUBSCRIBE_INDEX.getSubscriberInfo(clazz) != null) {
// 这个类需要注册 EventBus
result = true;
clazz = null;
} else {
String clazzName = clazz.getName();
// 跳过系统类(忽略 java. javax. android. androidx. 等开头包名的类)
if (clazzName.startsWith("java") || clazzName.startsWith("android")) {
clazz = null;
} else {
// 往上查找
clazz = clazz.getSuperclass();
}
}
}
// 这个类不需要注册 EventBus
if (result == null) {
result = false;
}
SUBSCRIBE_EVENT.put(subscriber.getClass().getName(), result);
return result;
}
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void onEventBus(EventBusManager helper) {
// // 占位,只为了能生成 MyEventBusIndex 索引类
// // 如果项目中已经有用到 @Subscribe 去注解方法,这个方法可以直接删除
// }
}