基于Rxjava2的事件总线:Rxbus
来源:互联网 发布:吉布提保障基地知乎 编辑:程序博客网 时间:2024/05/18 02:43
实现事件的通知和订阅的方法:EventBus、otto、Rxbus
基于Rxjava2
Step1:
compile 'io.reactivex.rxjava2:rxjava:2.1.5' compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
Step2:
package com.xl.test.http.rxBus;/** * Created by hushendian on 2017/11/16. */public class RxBusBaseMessage { private int code; private Object object; public RxBusBaseMessage(int code, Object object) { this.code = code; this.object = object; } public RxBusBaseMessage() { } public int getCode() { return code; } public Object getObject() { return object; }}
package com.xl.test.http.rxBus;/** * Created by jingbin on 2016/12/2. */public class RxCodeConstants { // 每日推荐跳转对应type下 public static final int JUMP_TYPE = 0; // 首页跳转到电影栏 public static final int JUMP_TYPE_TO_ONE = 1;}
package com.xl.test.http.rxBus;import io.reactivex.Observable;import io.reactivex.functions.Function;import io.reactivex.functions.Predicate;import io.reactivex.subjects.PublishSubject;import io.reactivex.subjects.Subject;/** * Created by hushendian on 2017/11/16. */public class RxBus { private static volatile RxBus instance; private Subject<Object> bus; public static RxBus getInstance() { if (instance == null) { synchronized (RxBus.class) { if (instance == null) { instance = new RxBus(); } } } return instance; } public RxBus() { bus = PublishSubject.create().toSerialized(); } public void send(Object o) { bus.onNext(o); } /** * 提供了一个新的事件,根据code进行分发 * * @param code * @param o */ public void send(int code, Object o) { bus.onNext(new RxBusBaseMessage(code, o)); } public Observable<Object> toObservable() { return bus; } /** * 根据传递的eventtype类型返回特定类型(eventype)的被观察者 */ public <T> Observable<T> tObservable(Class<T> EventType) { return bus.ofType(EventType); } /*** * * 根据传递的code和 eventType 类型返回特定类型(eventType)的 被观察者 * 对于注册了code为0,class为voidMessage的观察者,那么就接收不到code为0之外的voidMessage。 */ public <T> Observable<T> tObservable(final int code, final Class<T> eventType) { return bus.ofType(RxBusBaseMessage.class).filter(new Predicate<RxBusBaseMessage>() { @Override public boolean test(RxBusBaseMessage o) throws Exception { return o.getCode() == code && eventType.isInstance(o.getObject()); } }).map(new Function<RxBusBaseMessage, Object>() { @Override public Object apply(RxBusBaseMessage o) throws Exception { return o.getObject(); } }).cast(eventType); } /** * 判断是否有订阅者 */ public boolean hasSubscribers() { return bus.hasObservers(); } /** * 注销 */ public void unRegisterAll() { bus.onComplete(); }}
调用:
1.发送数据:
RxBus.getInstance().send(RxCodeConstants.JUMP_TYPE_TO_ONE,new RxBusBaseMessage());
接受数据:
RxBus.getInstance().tObservable(RxCodeConstants.JUMP_TYPE_TO_ONE, RxBusBaseMessage.class) .subscribe(new Consumer<RxBusBaseMessage>() { @Override public void accept(RxBusBaseMessage rxBusBaseMessage) throws Exception { Log.d(TAG, "accept: "); mBinding.include.vpContent.setCurrentItem(1); } });
基于Rxjava
Step1:
compile 'io.reactivex:rxjava:1.1.0'compile 'io.reactivex:rxandroid:1.1.0'
Step2:
package com.example.jingbin.cloudreader.http.rx;import rx.Observable;import rx.functions.Func1;import rx.subjects.PublishSubject;import rx.subjects.SerializedSubject;import rx.subjects.Subject;/** * Created by jingbin on 16/5/17. */public class RxBus { /** * 参考网址: http://hanhailong.com/2015/10/09/RxBus%E2%80%94%E9%80%9A%E8%BF%87RxJava%E6%9D%A5%E6%9B%BF%E6%8D%A2EventBus/ * http://www.loongwind.com/archives/264.html * https://theseyears.gitbooks.io/android-architecture-journey/content/rxbus.html */ private static volatile RxBus mDefaultInstance; private RxBus() { } public static RxBus getDefault() { if (mDefaultInstance == null) { synchronized (RxBus.class) { if (mDefaultInstance == null) { mDefaultInstance = new RxBus(); } } } return mDefaultInstance; } private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create()); public void send(Object o) { _bus.onNext(o); } public Observable<Object> toObservable() { return _bus; } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 * @param eventType 事件类型 * @param <T> * @return */ public <T> Observable<T> toObservable(Class<T> eventType) { return _bus.ofType(eventType); } /** * 提供了一个新的事件,根据code进行分发 * @param code 事件code * @param o */ public void post(int code, Object o){ _bus.onNext(new RxBusBaseMessage(code,o)); } /** * 根据传递的code和 eventType 类型返回特定类型(eventType)的 被观察者 * 对于注册了code为0,class为voidMessage的观察者,那么就接收不到code为0之外的voidMessage。 * @param code 事件code * @param eventType 事件类型 * @param <T> * @return */ public <T> Observable<T> toObservable(final int code, final Class<T> eventType) { return _bus.ofType(RxBusBaseMessage.class) .filter(new Func1<RxBusBaseMessage,Boolean>() { @Override public Boolean call(RxBusBaseMessage o) { //过滤code和eventType都相同的事件 return o.getCode() == code && eventType.isInstance(o.getObject()); } }).map(new Func1<RxBusBaseMessage,Object>() { @Override public Object call(RxBusBaseMessage o) { return o.getObject(); } }).cast(eventType); } /** * 判断是否有订阅者 */ public boolean hasObservers() { return _bus.hasObservers(); }}
发送数据:
RxBus.getDefault().post(RxCodeConstants.JUMP_TYPE_TO_ONE, new RxBusBaseMessage());
接收数据:
RxBus.getDefault().toObservable(RxCodeConstants.JUMP_TYPE_TO_ONE, RxBusBaseMessage.class) .subscribe(new Action1<RxBusBaseMessage>() { @Override public void call(RxBusBaseMessage integer) { mBinding.include.vpContent.setCurrentItem(1); } });
阅读全文
0 0
- 基于Rxjava2的事件总线:Rxbus
- 基于Rxjava2的事件总线:Rxbus
- RxBus基于Rxjava2.0---支持Sticky事件
- Rxjava2使用-构建事件总线(RxBus)代替原生广播
- RxBus事件总线的实现
- RxBus事件总线的实现
- RxBus的使用(基于RxJava2.0)
- Android Rxbus事件总线
- Rxbus实现事件总线
- 基于RxJava2的RxBus,打造属于你自己的EventBus
- 使用RxJava实现的超简单事件总线RxBus
- RxBus进阶------基于RxJava2.x实现以注解的方式传递消息
- RxBus在rxjava2.0 的使用
- RxJava实现事件总线——RxBus
- RxJava实现事件总线(RxBus)及详解
- Android studio 事件总线RxBus学习总结
- 基于RxJava的RxBus
- 基于Rxrelay的RxBus
- js中数组的处理函数
- 软件架构师
- springmvc项目:spring配置文件
- php pdo连接mysql必须扩展
- 解决www和不带www的跨域问题
- 基于Rxjava2的事件总线:Rxbus
- [BZOJ] 1012
- BT.601与BT.656
- Python安装pip
- 杂-spring-Security-RestTemplate
- 使用combobox做模糊查询、匹配时,改从开始位置匹配为从任意位置匹配
- elastic-job接入
- nuke根据不同版本加载插件
- integer.tostring(int i) 和Sting.valueof(int)