自定义RxBus,RxManager with RxJava2
来源:互联网 发布:wto数据全球进出口额 编辑:程序博客网 时间:2024/06/03 19:27
现在查到的关于RxBus, RxManager的封装大部分是基于RxJava1的,从RxJava1到RxJava2的变化很大,很难平滑地过度,所以自己根据RxJava2重新封装下RxBus和RxManager
RxBus.java
public class RxBus { private static RxBus instance; /** * ConcurrentHashMap: 线程安全集合 * Subject 同时充当了Observer和Observable的角色 */ @SuppressWarnings("rawtypes") private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>(); public static synchronized RxBus getInstance() { if(null == instance) { instance = new RxBus(); } return instance; } private RxBus() { } /** * 订阅事件源 * * @param observable * @param consumer * @return */ public RxBus onEvent(Observable<?> observable, Consumer<Object> consumer) { observable.observeOn(AndroidSchedulers.mainThread()) .subscribe(consumer, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { throwable.printStackTrace(); } }); return getInstance(); } /** * 注册事件源 * * @param tag key * @param <T> * @return */ @SuppressWarnings({"rawtypes"}) public <T> Observable<T> register(@NonNull Object tag) { List<Subject> subjectList = subjectMapper.get(tag); if(null == subjectList) { subjectList = new ArrayList<>(); subjectMapper.put(tag, subjectList); } Subject<T> subject = PublishSubject.create(); subjectList.add(subject); // LogUtil.log("register" + tag + " size:" + subjectList.size()); return subject; } /** * 取消整个tag的监听 * * @param tag key */ @SuppressWarnings("rawtypes") public void unregister(@NonNull Object tag) { List<Subject> subjectList = subjectMapper.get(tag); if(null != subjectList) { subjectMapper.remove(tag); } } /** * 取消tag里某个observable的监听 * * @param tag key * @param observable 要删除的observable * @return */ @SuppressWarnings("rawtypes") public RxBus unregister(@NonNull Object tag, @NonNull Observable<?> observable) { if(null == observable) { return getInstance(); } List<Subject> subjectList = subjectMapper.get(tag); if(null != subjectList) { // 从subjectList中删去observable subjectList.remove((Subject<?>) observable); // 若此时subjectList为空则从subjectMapper中删去 if(isEmpty(subjectList)) { subjectMapper.remove(tag); } } return getInstance(); } /** * 触发事件 * * @param content */ public void post(@NonNull Object content) { post(content.getClass().getName(), content); } /** * 触发事件 * * @param tag key * @param content */ @SuppressWarnings({"unchecked", "rawtypes"}) public void post(@NonNull Object tag, @NonNull Object content) { List<Subject> subjectList = subjectMapper.get(tag); if(!isEmpty(subjectList)) { for(Subject subject : subjectList) { subject.onNext(content); } } } /** * 判断集合是否为空 * * @param collection 集合 * @return */ @SuppressWarnings("rawtypes") public static boolean isEmpty(Collection<Subject> collection) { return null == collection || collection.isEmpty(); }}
RxManager.java
public class RxManager { public RxBus mRxBus = RxBus.getInstance(); /** * 管理观察源 */ private Map<String, Observable<?>> mObservableMap = new HashMap<>(); /** * 管理订阅者 */ private CompositeDisposable mCompositeSubscription = new CompositeDisposable(); public void on(String eventName, Consumer<Object> consumer) { // 注册 Observable<?> mObservable = mRxBus.register(eventName); mObservableMap.put(eventName, mObservable); mCompositeSubscription .add(mObservable.observeOn(AndroidSchedulers.mainThread()) .subscribe(consumer, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { throwable.printStackTrace(); } })); } /** * 添加订阅者到mCompositeSubscription * * @param m 要添加的订阅者 */ public void add(Disposable m) { mCompositeSubscription.add(m); } /** * 取消所有注册 */ public void clear() { // 取消订阅 mCompositeSubscription.dispose(); for(Map.Entry<String, Observable<?>> entry : mObservableMap.entrySet()) { // 取消注册 mRxBus.unregister(entry.getKey(), entry.getValue()); } } /** * 触发事件 * * @param tag * @param content */ public void post(Object tag, Object content) { mRxBus.post(tag, content); }}
0 0
- 自定义RxBus,RxManager with RxJava2
- 自定义RxBus,RxManager with RxJava2
- RxBus和RxManager管理rxJava的生命周期
- RxBus在rxjava2.0 的使用
- 基于Rxjava2的事件总线:Rxbus
- RxBus的使用(基于RxJava2.0)
- RxBus基于Rxjava2.0---支持Sticky事件
- 基于Rxjava2的事件总线:Rxbus
- 项目重构经验三——Rxjava的使用,RxBus,RxManager,结合retrofit的使用
- RxJava自定义RxBus
- 基于RxJava2的RxBus,打造属于你自己的EventBus
- 【笔记】RxJava2.0新特性简单介绍并实现RxBus
- Rxjava2使用-构建事件总线(RxBus)代替原生广播
- 个人项目-一之(MVP+RxJava2+Retrofit2+RxBus+Glide)
- RxBus
- RxBus
- RXBUS
- RxBus
- vue 开发环境搭建
- pojo和javabean的区别
- js 正则表达式判断有效数
- 简单理解JavaScript中的原型
- 什么是java序列化,如何实现java序列化?
- 自定义RxBus,RxManager with RxJava2
- angular2
- unity 3d 中paint in 3d插件的简单使用
- 开源的 IM 项目 Sealtalk
- 考研---数学全书--一元微分学
- Ambari-server源码分析:核心类-心跳处理agent.HeartBeatHandler
- Ubuntu16.04下在线安装OpenDaylight 控制器
- leetcode解题之69.Sqrt(x) & 367. Valid Perfect Square Java版 (求一个数的平方根)
- 并查集(含代码)