RxBus-mvp模式下对Rxjav的封装(二)

来源:互联网 发布:办公软件高级应用 编辑:程序博客网 时间:2024/06/05 20:07

一、自定义注解,用于标记观察者模式

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RegisterBus {}
二、定义一个RxBus的类

public class RxBus {    public static final String TAG = "RxBus";    private static volatile RxBus instance;//使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性    //订阅者集合    private Set<Object> subscribers;    /**     * 注册DataBusSubscriber     */    public synchronized void register(Object subscriber) {        subscribers.add(subscriber);    }    /**     * 注销DataBusSubscriber     */    public synchronized void unregister(Object subscriber) {        subscribers.remove(subscriber);    }    /**     * 单例模式     */    private RxBus() {        //因为通常需要复制整个基础数组,所以可变操作(add()set()  remove() 等等)的开销很大        subscribers = new CopyOnWriteArraySet<>();    }    public static synchronized RxBus getInstance() {        if (instance == null) {            synchronized (RxBus.class) {                if (instance == null) {                    instance = new RxBus();                }            }        }        return instance;    }    /**     * 包装处理过程     */    public void chainProcess(Func1 func) {        Observable.just("")                .subscribeOn(Schedulers.io())//指定处理过程在IO线程                .map(func)//包装处理过程                .observeOn(AndroidSchedulers.mainThread())//指定事件消费在主线程                .subscribe(new Action1<Object>() {                    @Override                    public void call(Object data) {                          if(data==null){                              return;                          }                        send(data);                    }                });    }    private void send(Object data) {        for (Object subscriber : subscribers) {           //扫描注解,将数据发送到注册的对象的标记方法            callMethodByAnnotiation(subscriber,data);        }    }    /**     * 反射获取对象方法列表,判断     * 1.是否被注解修饰     * 2.参数类型是否和data类型一直     */    private void callMethodByAnnotiation(Object target, Object data) {        Method[] methodArray = target.getClass().getDeclaredMethods();        for(int i=0;i<methodArray.length;i++){          try {              if(methodArray[i].isAnnotationPresent(RegisterBus.class)){                  //@RegisterBus修饰的方法                  Class paramType = methodArray[i].getParameterTypes()[0];                  if(data.getClass().getName().equals(paramType.getName())){                      //参数类型和data类型一样,调用此方法                      methodArray[i].invoke(target,new Object[]{data});                  }              }          }catch (InvocationTargetException e) {              e.printStackTrace();          } catch (IllegalAccessException e) {              e.printStackTrace();          }        }    }}
三、RxBus的测试
public class RxBusTest {    public static final String  TAG="RxBusTest";    Presenter presenter;    @Before    public void setUp() throws Exception{        /**         * 初始化presenter并注册         */        presenter=new Presenter(new Manager());        RxBus.getInstance().register(presenter);    }    @After    public void tearDown(){        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        RxBus.getInstance().unregister(presenter);    }    @Test    public void testGetUser() throws Exception{        presenter.getUser();    }    @Test    public void testGetOrder()throws Exception    {        presenter.getOrder();    }    /**     * 模拟Presenter     */    class Presenter  {        private Manager manager;        public Presenter(Manager manager) {            this.manager = manager;        }        public void getUser() {            manager.getUser();        }        public void getOrder() {            manager.getOrder();        }        /**         * 接受数据         *         */        @RegisterBus        public void onUser(User user){            Log.d(TAG, "receiver User in thread" + Thread.currentThread());        }        @RegisterBus        public void onOrder(Order order){            Log.d(TAG, "receiver Order in thread" + Thread.currentThread());        }    }    /**     * 模拟model     */    class Manager {        public void getUser() {            RxBus.getInstance().chainProcess(new Func1() {                @Override                public Object call(Object o) {                    Log.d(TAG, "chainProcess getUser start in thread:" + Thread.currentThread());                    User user = new User();                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    return user;                }            });        }        public void getOrder() {            RxBus.getInstance().chainProcess(new Func1() {                @Override                public Object call(Object o) {                    Log.d(TAG, "chainProcess getUser start in thread:" + Thread.currentThread());                    Order order = new Order();                    return order;                }            });        }    }    /**     * 要返回的数据类型     */    class User {    }    class Order {    }}