RxJava实现的一个Event Bus->RxBus。
目前Android上最火的两个Event Bus库是Otto和Green Robot’sEventBus,两个事件总线库写的都非常不错。不过这里不是讲事件总线,而是讲如何通过RxJava来实现事件总线的效果。总体来说,代码非常的简单,十几行代码就搞定了!
下面RxBus的配置:
import rx.Observable; import rx.functions.Func1; import rx.subjects.PublishSubject; import rx.subjects.SerializedSubject; import rx.subjects.Subject; 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使用:
1.添加依赖
compile 'io.reactivex:rxandroid:1.0.1'
compile 'io.reactivex:rxjava:1.0.14'
2.
RxBus.getDefault().send(steps, EVENT_STEP_CHANGE);
RxBus send 发送的是一个对象,这里我们可以像EventBus一样,发送一个Code,和请求,此时我们可以把发送的对象封装一个类出来。如下:
即如上图所示的:RxBusBaseMessage类。
package cn.com.dowedo.retfitdemo.http.rx; /** * Created by jingbin on 16/5/17. */ 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; } }
接收消息:在Activity里先初始化:
private void initRxBus() { RxBus.getDefault().toObservable(RxCodeConstants.JUMP_TYPE_TO_ONE, RxBusBaseMessage.class) .subscribe(new Action1<RxBusBaseMessage>() { @Override public void call(RxBusBaseMessage integer) { try { Toast.makeText(MainActivity.this, member.getMobile(), Toast.LENGTH_LONG); etName.setHint(member.getMobile()); etPassword.setHint(member.getRealname()); } catch (Exception e) { e.printStackTrace(); } } }); }
一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。最后我们得把RxBus给注销:
@Overrideprotected void onDestroy() {
super.onDestroy();
if(!rxSubscription.isUnsubscribed()) {
rxSubscription.unsubscribe();
}
}