1.线程类型的定义
package com.demo.administrator.eventbus.eventbus;
public enum ThreadMode {
POSTING,
MAIN,
BACKGROUND,
ASYNC
}
2.注解的定义
package com.demo.administrator.eventbus.eventbus;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
}
3.反射方法的封装
package com.demo.administrator.eventbus.eventbus;
import java.lang.reflect.Method;
public class MethodManager {
//方法的参数
private Class<?> paramType;
//方法的名字
private Method method;
//注解的类型
private ThreadMode threadMode;
public MethodManager(Class<?> paramType, Method method, ThreadMode threadMode) {
this.paramType = paramType;
this.method = method;
this.threadMode = threadMode;
}
public Class<?> getParamType() {
return paramType;
}
public void setParamType(Class<?> paramType) {
this.paramType = paramType;
}
public Method getMethod() {
return method;
}
public void setMethod(Method method) {
this.method = method;
}
public ThreadMode getThreadMode() {
return threadMode;
}
public void setThreadMode(ThreadMode threadMode) {
this.threadMode = threadMode;
}
}
4.EventBus类的实现
package com.demo.administrator.eventbus.eventbus;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class EventBus {
private static volatile EventBus instance;
// Map<key,value> key为注册的Activity或者Fragment,value为该key含有的EventBus注解的方法集合
private Map<Object, List<MethodManager>> mapCaches;
private EventBus() {
mapCaches = new HashMap<>();
}
public static EventBus getDefault() {
if (null == instance) {
synchronized (EventBus.class) {
if (null == instance) {
instance = new EventBus();
}
}
}
return instance;
}
public void register(Object getter) {
List<MethodManager> methodsList = mapCaches.get(getter);
if (methodsList == null || methodsList.size() == 0) {
methodsList = new ArrayList<>();
Class<?> clazz = getter.getClass();
//获取所有的公共方法,包括父类
Method[] methods = clazz.getMethods();
String clazzName = clazz.getName();
while(clazz!=null){
//如果父类为java.,javax.,android.开头的,认为是系统类直接返回
if (clazzName.startsWith("java.") ||
clazzName.startsWith("javax.") || clazzName.startsWith("android.")) {
return;
}
for (Method method : methods) {
//获取该方法是否含有EventBus注解
Subscribe annotation = method.getAnnotation(Subscribe.class);
if (annotation == null) {
continue;
}
Type type = method.getGenericReturnType();
if (!"void".equals(type.toString())) {
throw new RuntimeException(method.getName() + "返回值类型必须为void类型");
}
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length != 1) {
throw new RuntimeException(method.getName() + "参数个数必须为1");
}
MethodManager methodManager = new MethodManager(parameterTypes[0],
method, annotation.threadMode());
methodsList.add(methodManager);
}
}
mapCaches.put(getter, methodsList);
}
}
public void post(Object setter) {
Set<Object> set = mapCaches.keySet();
for (Object getter : set) {
List<MethodManager> methodList = mapCaches.get(getter);
if (methodList != null) {
for (MethodManager methodManager : methodList) {
if (methodManager.getParamType().isAssignableFrom(setter.getClass())) {
try {
methodManager.getMethod().invoke(getter, setter);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
public void unregister(Object getter) {
mapCaches.remove(getter);
}
}
5.使用
package com.demo.administrator.eventbus;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.demo.administrator.eventbus.eventbus.EventBus;
import com.demo.administrator.eventbus.eventbus.Subscribe;
import com.demo.administrator.eventbus.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// EventBus.register(this);
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventBus(UserBean userBean) {
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}