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 { }}
阅读全文
0 0
- RxBus-mvp模式下对Rxjav的封装(二)
- RxBus-mvp模式下对Rxjav的封装(一)
- Android 当中的 MVP 模式(二)封装
- RxBus(二)
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- Mvp-Retrofit-Rxjava-Rxbus的初步使用
- Android当中的MVP模式(四)插曲-封装OkHttp
- MVP模式+OKhttp的封装请求数据
- MVP模式及BaseActivity的简单封装
- Android之MVP(二)深入封装
- Android当中的MVP模式(七)终篇---关于对MVP模式中代码臃肿
- MVP模式下的生命周期
- RoyalAjax(二),对HttpRequest的封装
- 代理模式深入学习(二)——实现动态代理对事务的封装
- MVP、Retrofit、RxJava、RxBus
- 我对MVP模式的初步理解
- LeetCode--Largest Rectangle in Histogram
- 编程找出1000以内的所有完数。
- [Lintcode] #407 加一
- c++ list vector map set 简单区别
- web渗透步骤流程
- RxBus-mvp模式下对Rxjav的封装(二)
- MFC IP Control
- springboot中rabbitmq集成——单项目
- PLsql调试 存储过程
- pycharm常用设置和用法
- Touch_Java 6:接口和多态
- uses-permission和permission的区别
- Centos 7 Mysql数据库安装配置
- sql拼接问题解决