Andoid 总线设计 (三)
2016-07-24 18:09
260 查看
具体的代码设计:
标记注解 用于执行方法上面
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscriber {
SubscriberType type();
}
标记执行类型 同步或者异步
public enum SubscriberType {
ASYN, SYNC;
}
SubscribeMethod 保存目标函数的一个类:
里面有:
//执行对象
private Object object;
// 方法
private Method method;
// 参数 (只支持一个参数的方法)
private Class<> parameters;
//执行类型
private SubscriberType subscriberType;
省 get set
DistributeHandler 是一个分发接口
AsynDistributeHandler 异步分发实现。
SyncDistributeHandler 同步分发实现。
public interface DistributeHandler {
void handEvent(Object parameter);
}
public class AsynDistributeHandler implements DistributeHandler {
public AsynDistributeHandler(SubscribeMethod subscribeMethod) {
this.subscribeMethod = subscribeMethod;
}
}
public class SyncDistributeHandler implements DistributeHandler {
}
分发处理 管理类
DistributeManeger 管理事件的分发
public class DistributeManeger {
private DistributeHandler distributeHandler;
}
反射处理类 ReflectionHelper :
public class ReflectionHelper {
private static final String TAG = ReflectionHelper.class.getSimpleName();
}
EventBus 事件处理类:
public class EventBus {
private static EventBus instance;
}
好到此 代码写完了 接下来就是 测试及使用 最后总结一下。
标记注解 用于执行方法上面
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscriber {
SubscriberType type();
}
标记执行类型 同步或者异步
public enum SubscriberType {
ASYN, SYNC;
}
SubscribeMethod 保存目标函数的一个类:
里面有:
//执行对象
private Object object;
// 方法
private Method method;
// 参数 (只支持一个参数的方法)
private Class<> parameters;
//执行类型
private SubscriberType subscriberType;
省 get set
DistributeHandler 是一个分发接口
AsynDistributeHandler 异步分发实现。
SyncDistributeHandler 同步分发实现。
public interface DistributeHandler {
void handEvent(Object parameter);
}
public class AsynDistributeHandler implements DistributeHandler {
public AsynDistributeHandler(SubscribeMethod subscribeMethod) {
this.subscribeMethod = subscribeMethod;
}
private SubscribeMethod subscribeMethod = null; @Override public void handEvent(final Object parameter) { new Thread(new Runnable() { @Override public void run() { ReflectionHelper.invokeSubscribeMethod(subscribeMethod, parameter); } }).start(); }
}
public class SyncDistributeHandler implements DistributeHandler {
private SubscribeMethod subscribeMethod = null; public SyncDistributeHandler(SubscribeMethod subscribeMethod) { this.subscribeMethod = subscribeMethod; } @Override public void handEvent(Object parameter) { ReflectionHelper.invokeSubscribeMethod(subscribeMethod, parameter); }
}
分发处理 管理类
DistributeManeger 管理事件的分发
public class DistributeManeger {
private DistributeHandler distributeHandler;
/** * 分发事件 * * @param parameter */ public void post(Object parameter) { List<SubscribeMethod> subscribeMethods = ReflectionHelper.getTypeSubscribeMethods(parameter, EventBus.getInstance().getSubscribeMethodList()); for (SubscribeMethod subscribeMethod : subscribeMethods) { if (subscribeMethod.getSubscriberType().equals(SubscriberType.ASYN)) { distributeHandler = new AsynDistributeHandler(subscribeMethod); distributeHandler.handEvent(parameter); } else if (subscribeMethod.getSubscriberType().equals(SubscriberType.SYNC)) { distributeHandler = new SyncDistributeHandler(subscribeMethod); distributeHandler.handEvent(parameter); } } } /** * 注销 * * @param obj */ public void unregister(Object obj) { List<SubscribeMethod> subscribeMethods = ReflectionHelper.getTypeObjSubscribeMethod(obj, EventBus.getInstance().getSubscribeMethodList()); for (SubscribeMethod subscribeMethod : subscribeMethods) { EventBus.getInstance().getSubscribeMethodList().remove(subscribeMethod); } }
}
反射处理类 ReflectionHelper :
public class ReflectionHelper {
private static final String TAG = ReflectionHelper.class.getSimpleName();
/** * 获取 含有 @Subscriber 的方法 * * @param obj * @param subscribeMethodList */ public static void getSubscribeMethods(Object obj, List<SubscribeMethod> subscribeMethodList) { Class clazz = obj.getClass(); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(Subscriber.class) && method.getParameterTypes().length == 1) { Subscriber subscriber = method.getAnnotation(Subscriber.class); Class parameters = method.getParameterTypes()[0]; SubscribeMethod subscribeMethod = new SubscribeMethod(); subscribeMethod.setObject(obj); subscribeMethod.setMethod(method); subscribeMethod.setParameters(parameters); subscribeMethod.setSubscriberType(subscriber.type()); subscribeMethodList.add(subscribeMethod); } } } /** * * 根据 Post 函数里面的参数 获取 有这些参数的方法 * @param parameter * @param subscribeMethodList * @return */ public static List<SubscribeMethod> getTypeSubscribeMethods(Object parameter, List<SubscribeMethod> subscribeMethodList) { Class<?> clazz = parameter.getClass(); List<SubscribeMethod> typeSubscribeMethodList = new ArrayList<>(); for (SubscribeMethod subMethod : subscribeMethodList) { if (clazz.equals(subMethod.getParameters())) { typeSubscribeMethodList.add(subMethod); } } return typeSubscribeMethodList; } /** * 执行 * * @param subscribeMethod * @param parameter */ public static void invokeSubscribeMethod(SubscribeMethod subscribeMethod, Object parameter) { Method method = subscribeMethod.getMethod(); Object object = subscribeMethod.getObject(); try { method.setAccessible(true); method.invoke(object, parameter); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } /** * 根据 obj 获取 列表 * * @param obj * @param subscribeMethodList * @return */ public static List<SubscribeMethod> getTypeObjSubscribeMethod(Object obj, List<SubscribeMethod> subscribeMethodList) { List<SubscribeMethod> typeSubscribeMethodList = new ArrayList<>(); for (SubscribeMethod subMethod : subscribeMethodList) { if (obj.equals(subMethod.getObject())) { typeSubscribeMethodList.add(subMethod); } } return typeSubscribeMethodList; }
}
EventBus 事件处理类:
public class EventBus {
private static EventBus instance;
private List<SubscribeMethod> subscribeMethodList = new ArrayList<>(); private DistributeManeger distributeManeger = new DistributeManeger(); /** * @return */ public static EventBus getInstance() { if (null == instance) newInstance(); return instance; } /** * 初始化实例 */ private static synchronized void newInstance() { if (null == instance) { instance = new EventBus(); } } /** * 注册某对象 * 1 . 获取含有注解的方法 参数 * * @param obj */ public void register(Object obj) { ReflectionHelper.getSubscribeMethods(obj, subscribeMethodList); } /** * 发送事件 * * @param obj */ public void post(Object obj) { distributeManeger.post(obj); } /** * 反注册某对象 * * @param obj */ public void unregister(Object obj) { distributeManeger.unregister(obj); } /** * * @return */ public List<SubscribeMethod> getSubscribeMethodList() { return subscribeMethodList; }
}
好到此 代码写完了 接下来就是 测试及使用 最后总结一下。
相关文章推荐
- Binary Tree Longest Consecutive Sequence
- 【操作系统】存储器管理01-思维导图
- Android 二维码扫描和生成简单实现
- 重学 Statistics, Cha11 Inferences About Population Variances
- Java中对<对象> 和 <封装>的认识
- 专家系统介绍
- CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)
- 【操作系统】对换、分页和分段方式-思维导图
- Java开发工具MyEclipse的设置自动联想功能
- java程序中修改properties原始文件
- Swift--图片旋转动画
- 【操作系统】虚拟存储器(上)-思维导图 :虚拟存储器概述、请求分页存储方式
- Swift--图片旋转动画
- JavaSE 高级 第16节 读取缓冲类BufferedReader
- ztree jquery 树 控件
- 【操作系统】虚拟存储器(下)-思维导图
- 事件相关的-内存和性能
- sk_buff封装和解封装网络数据包的过程详解
- tomcat - 报错 No such device; No faulty members identified.
- Range Sum Query 2D -- leetcode