理解EventBus,实现EventBus基础功能
EventBus基础用法以及对每一步的理解:
注:只是初步实现基础流程,粘性事件和子线程等并不在范畴内,仅用于自己记忆
一.注册当前监听EventBus.getDefault().register(this);
把当前页面的类,所有被@Subscribe标注的方法和该方法的参数保存到缓存中等待使用
/**
* 注册当前类
* @param object
*/
public void register(Object object) {
Class<?> aClass = object.getClass();
/**获取当前类的全部方法*/
Method[] methods = aClass.getDeclaredMethods();
SubEventBean subEventBean = new SubEventBean();
ArrayList<SubEventBean.MethodAndEventBean> methodAndEventBeans = new ArrayList<>();
for (Method method : methods) {
SubEventBean.MethodAndEventBean methodAndEventBean = new SubEventBean.MethodAndEventBean();
Subscribe annotation = method.getAnnotation(Subscribe.class);
if (null != annotation) {
Log.d(TAG, "event=========="+method.getName());
/**获取当前方法的全部参数 其实就是当前订阅事件的Bean*/
Class<?>[] parameterTypes = method.getParameterTypes();
if (null != parameterTypes && parameterTypes.length == 1) {
Class<?> eventType = parameterTypes[0];//当前页面订阅的事件
methodAndEventBean.setMethod(method);
methodAndEventBean.setEvent(eventType);
methodAndEventBeans.add(methodAndEventBean);
}
}
}
subEventBean.setMethods(methodAndEventBeans);
/***把注册的类 方法 和 事件类型封装进map待用*/
activity_subEvnt_map.put(object, subEventBean);
}
二.发送事件 EventBus.getDefault().post(demoBean);
发送Event,通过Event从注册时候的缓存中获取对应Event注册的所在类和方法,使用反射执行该类中的方法
/**
* 发送通知 主要功能 通过发送的事件类型在之前注册的类map中找到对应的方法 和类 通过反射调用
* @param obj
*/
public void post(Object obj) {
Class<?> aClass = obj.getClass();
Set<Map.Entry<Object, SubEventBean>> activityEnts = activity_subEvnt_map.entrySet();
for (Map.Entry<Object, SubEventBean> ent : activityEnts) {
SubEventBean value = ent.getValue();
List<SubEventBean.MethodAndEventBean> methods = value.getMethods();
for (int i=0; i<methods.size(); i++) {
SubEventBean.MethodAndEventBean methodAndEventBean = methods.get(i);
Class<?> classes = methodAndEventBean.getEvent();
if (classes.getName().equals(aClass.getName())) {
Object key = ent.getKey();
try {
methodAndEventBean.getMethod().invoke(key, obj);//反射触发注册的方法
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
三.注销监听EventBus.getDefault().unregister(this);
清除之前该类在缓存中的数据
/**
* 清除注册的
* @param obj
*/
public void unregister(Object obj) {
activity_subEvnt_map.remove(obj);
}
相关的类
package com.example.XXX.myapplicationdemo.EventBus;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by qf on 2018/7/18
* 描述: EventBus
*/
public class EventBus {
private static final String TAG= "EventBus";
static volatile EventBus eventBus;
/**
* 存储订阅类详细信息
*/
public Map<Object, SubEventBean> activity_subEvnt_map = new LinkedHashMap<>();
private EventBus(){
}
public static EventBus getEventBus(){
if (null == eventBus) {
synchronized (EventBus.class) {
if (null == eventBus) {
eventBus = new EventBus();
}
}
}
return eventBus;
}
/**
* 注册当前类
* @param object
*/
public void register(Object object) {
Class<?> aClass = object.getClass();
/**获取当前类的全部方法*/
Method[] methods = aClass.getDeclaredMethods();
SubEventBean subEventBean = new SubEventBean();
ArrayList<SubEventBean.MethodAndEventBean> methodAndEventBeans = new ArrayList<>();
for (Method method : methods) {
SubEventBean.MethodAndEventBean methodAndEventBean = new SubEventBean.MethodAndEventBean();
Subscribe annotation = method.getAnnotation(Subscribe.class);
if (null != annotation) {
Log.d(TAG, "event=========="+method.getName());
/**获取当前方法的全部参数 其实就是当前订阅事件的Bean*/
Class<?>[] parameterTypes = method.getParameterTypes();
if (null != parameterTypes && parameterTypes.length == 1) {
Class<?> eventType = parameterTypes[0];//当前页面订阅的事件
methodAndEventBean.setMethod(method);
methodAndEventBean.setEvent(eventType);
methodAndEventBeans.add(methodAndEventBean);
}
}
}
subEventBean.setMethods(methodAndEventBeans);
/***把注册的类 方法 和 事件类型封装进map待用*/
activity_subEvnt_map.put(object, subEventBean);
}
/**
* 发送通知 主要功能 通过发送的事件类型在之前注册的类map中找到对应的方法 和类 通过反射调用
* @param obj
*/
public void post(Object obj) {
Class<?> aClass = obj.getClass();
Set<Map.Entry<Object, SubEventBean>> activityEnts = activity_subEvnt_map.entrySet();
for (Map.Entry<Object, SubEventBean> ent : activityEnts) {
SubEventBean value = ent.getValue();
List<SubEventBean.MethodAndEventBean> methods = value.getMethods();
for (int i=0; i<methods.size(); i++) {
SubEventBean.MethodAndEventBean methodAndEventBean = methods.get(i);
Class<?> classes = methodAndEventBean.getEvent();
if (classes.getName().equals(aClass.getName())) {
Object key = ent.getKey();
try {
methodAndEventBean.getMethod().invoke(key, obj);//反射触发注册的方法
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 清除注册的
* @param obj
*/
public void unregister(Object obj) {
activity_subEvnt_map.remove(obj);
}
}
package com.example.XXXX.myapplicationdemo.EventBus;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by qf on 2018/7/18
* 描述: Subscribe
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
}
package com.example.XXXX.myapplicationdemo.EventBus;
import java.lang.reflect.Method;
import java.util.List;
/**
* Created by qf on 2018/7/18
* 描述: SubEventBean
*/
public class SubEventBean {
public Object subscribe;
public List<MethodAndEventBean> methods;
@Override
public String toString() {
return "SubEventBean{" +
"subscribe=" + subscribe +
", methods=" + methods +
'}';
}
public Object getSubscribe() {
return subscribe;
}
public void setSubscribe(Object subscribe) {
this.subscribe = subscribe;
}
public List<MethodAndEventBean> getMethods() {
return methods;
}
public void setMethods(List<MethodAndEventBean> methods) {
this.methods = methods;
}
public static class MethodAndEventBean {
public Method method;
public Class<?> Event;
public Method getMethod() {
return method;
}
public void setMethod(Method method) {
this.method = method;
}
public Class<?> getEvent() {
return Event;
}
public void setEvent(Class<?> event) {
Event = event;
}
@Override
public String toString() {
return "MethodAndEventBean{" +
"method=" + method +
", Event=" + Event +
'}';
}
}
}
用法
同正式版使用类似
1.注册 EventBus.getEventBus().register(this);
2.发送事件 EventBus.getEventBus().post(“这是测试”);
3.注销 EventBus.getEventBus().unregister(this);