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

news/2024/7/3 6:18:30

一、首先定义一个Presenter接口:DataBusSubscriber

用来接受数据

public interface DataBusSubscriber {
    void onEvent(Object data);
}
二、定义一个RxBus的封装类

public class RxBus {
    public static final String TAG = "RxBus";
    private static volatile RxBus instance;//使用volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性
    //订阅者集合
    private Set<DataBusSubscriber> subscribers;

    /**
     * 注册DataBusSubscriber
     */
    public synchronized void register(DataBusSubscriber subscriber) {
        subscribers.add(subscriber);
    }

    /**
     * 注销DataBusSubscriber
     */
    public synchronized void unregister(DataBusSubscriber 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) {
                        Log.d(TAG, "chainProcess start");
                        for (DataBusSubscriber s : subscribers) {
                            //数据发送到注册的DataBusSubscriber
                            s.onEvent(data);
                        }
                    }
                });

    }
}
第三步:测试

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 implements DataBusSubscriber {
        private Manager manager;

        public Presenter(Manager manager) {
            this.manager = manager;
        }

        public void getUser() {
            manager.getUser();
        }

        public void getOrder() {
            manager.getOrder();
        }

        /**
         * 接受数据
         *
         * @param data
         */
        @Override
        public void onEvent(Object data) {
            if (data instanceof User) {
                Log.d(TAG, "receiver User in thread" + Thread.currentThread());
            } else if (data instanceof Order) {
                Log.d(TAG, "receiver Order in thread" + Thread.currentThread());
            } else {
                Log.d(TAG, "receiver data 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 {

    }
}


http://www.niftyadmin.cn/n/3649287.html

相关文章

VS 2005 Team Suite 轻松搞定白盒测试

注&#xff1a;此文的Word版本首次发表于&#xff1a; http://bbs.5etesting.com/viewthread.php?tid18&highlight%B0%D7%BA%D0%B2%E2%CA%D4 VS 2005 Team Suite轻松搞定白盒测试 &#xff08;此文已于《测试天地》杂志发表&#xff0c;如需转载&#xff0c;请与作者联系…

[推荐]dotNET中进程间同步/通信的经典框架

推荐一篇关于dotNET中常用的进程间同步或通信的框架文章&#xff1a;A C# Framework for Interprocess Synchronization and CommunicationBy Christoph Ruegg How to share resources and implement a rich message/data passing architecture between threads and processes …

Android 开发之RxJava 详解

我从去年开始使用 RxJava &#xff0c;到现在一年多了。今年加入了 Flipboard 后&#xff0c;看到 Flipboard 的 Android 项目也在使用 RxJava &#xff0c;并且使用的场景越来越多 。而最近这几个月&#xff0c;我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是…

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

一、自定义注解&#xff0c;用于标记观察者模式 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface RegisterBus {} 二、定义一个RxBus的类 public class RxBus {public static final String TAG "RxBus";private stati…

离子赝势文件_排除离子错误

离子赝势文件Below is a brief overview on how to get started troubleshooting bugs in your Ionic projects. 以下是有关如何开始对Ionic项目中的错误进行故障排除的简要概述。 介绍 (Introduction) There are two main types of bugs that occur when developing in Ionic…

QuickTest底层VB脚本驱动

sample Codes: **** Author: Wally Yu (俞戴龙)*** Import common functions into report function ****Dim fso : set fso createobject("scripting.filesystemobject")executeglobal fso.opentextfile("C:\Framework\FrameworkCore\Common\common.vbs&q…

[收藏]使用 WSE 2.0 从 WS-Routing 转移到 WS-Addressing

使用 WSE 2.0 从 WS-Routing 转移到 WS-Addressing发布日期&#xff1a; 5/202004| 更新日期&#xff1a; 5/20/2004Aaron SkonnardNorthface University适用于&#xff1a;Web Services Enhancements 2.0 for Microsoft.NETWS-Routing 规范WS-Addressing 规范摘要&#xff1a;…

android studio下的sha1值获取

一、首先在app下定义一个文件夹&#xff1a;keystore Build->Generate Signed APK->Create New key store->选择自己项目的keystore下&#xff0c;名字写build->输入密码和其他信息&#xff0c;Alias我写的是build->选择build 二、完成后重复上步骤 Build-&g…