美文网首页
Android-简易版EventBus

Android-简易版EventBus

作者: 大风车__ | 来源:发表于2020-04-01 16:32 被阅读0次
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();
}

相关文章

网友评论

      本文标题:Android-简易版EventBus

      本文链接:https://www.haomeiwen.com/subject/ktyauhtx.html