public class EventBus {
private static EventBus singleInstance = null;
private WeakHashMap<Object, Subscriber> cache;
private EventBus() {
cache = new WeakHashMap();
}
public static EventBus getInstance() {
if (singleInstance == null) {
synchronized (EventBus.class) {
if (singleInstance == null) {
singleInstance = new EventBus();
}
}
}
return singleInstance;
}
public void register(Object object) {
Subscriber subscriber = cache.get(object);
if (subscriber == null) {
subscriber = new Subscriber(object);
cache.put(object, subscriber);
}
}
public void unregister(Object object) {
if (cache.containsKey(object)) {
cache.remove(object);
}
}
public void addObserver(String name) {
}
public void post(String name, Object object) {
for (Object key : cache.keySet()) {
Subscriber subscriber = cache.get(key);
List<SubscriberMethod> methods = subscriber.getMethods();
for (SubscriberMethod method : methods) {
if (method.getName().equals(name) && method.getParameter().isAssignableFrom(object.getClass())) {
try {
method.getMethod().invoke(subscriber.getObject(), object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
public class Subscriber {
private List<SubscriberMethod> methods;
private WeakReference object;
public Subscriber(Object object) {
this.object = new WeakReference(object);
methods = new ArrayList();
Class<?> clazz = object.getClass();
while (clazz != null) {
String name = clazz.getName();
if (name.startsWith("java.") ||
name.startsWith("javax.") ||
name.startsWith("android.") ||
name.startsWith("androidx.")) {
break;
}
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
Response annotation = method.getAnnotation(Response.class);
if (annotation == null) {
continue;
}
Class<?>[] types = method.getParameterTypes();
if (types.length != 1) {
continue;
}
method.setAccessible(true);
SubscriberMethod sMethod = new SubscriberMethod(annotation.name(), method, types[0]);
methods.add(sMethod);
}
clazz = clazz.getSuperclass();
}
}
public List<SubscriberMethod> getMethods() {
return methods;
}
public Object getObject() {
return object.get();
}
}
public class SubscriberMethod {
private String name;
private Method method;
private Class<?> parameter;
public SubscriberMethod(String name, Method method, Class<?> parameter) {
this.name = name;
this.method = method;
this.parameter = parameter;
}
public String getName() {
return name;
}
public Method getMethod() {
return method;
}
public Class<?> getParameter() {
return parameter;
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Response {
String name();
}
网友评论