EventBus替代品, RxBus.



由于最近Rxjava 很是火爆, 所以也不得不去学习了 Rxjava 这个非常牛逼的框架。下面我们来用Rxjava实现 EventBus, 我们称它为 RxBus.


我们正常使用Rxjava的时候, 基本都是用以下三个基本创建方式.

Observable.create()
Observable.just()
Observable.from()
1. 传递一个OnSubscribe 并在其内复写 call方法, 并且调用传递回来的Subscriber. onNext 来通知订阅者. 

2. 接受一个可变参数, 并且将其原封不动的挨个发送.

3. 接受一个数组、集合类型参数 并将其转化为单个对象发送.    其实它还接受Future类型的参数,不过并没有深入了解.

以上方式创建的话,如果不采用操作符 那么它们是会立刻发送的, 也就是所谓的热发送, 如果加了修饰符,就我现在了解也就是类似延迟、定时发送等操作.   然而,我们是要实现类似EventBus那样.   所以这时我们就要用到一个类 PublishSubject。

它创建后在需要通知信息的时, 只需要调用该对象的 onNext方法就可以.   PublicSubject有两种创建方式,如下。

private final PublishSubject mBus =PublishSubject.create();
private final  Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());
然而 第一种 并不是线程同步的, 所以一般我们采用第二种。


private RxBus() {
}

static class INSTANCE {
    static RxBus instance = new RxBus();
}


public static RxBus getInstance() {
    return INSTANCE.instance;
}


public void send(Object o) {
    mBus.onNext(o);
}


public Observable<Object> toObservable() {
    return mBus;
}

public boolean hasObservable() {
    return mBus.hasObservers();
}

以上是一个单利的RxBus类。供我们使用.

接下来我们需要在BaseActivity中获取RxBus实例。


private RxBus mRxBus;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    
    if(mRxBus==null)
        mRxBus =RxBus.getInstance();
}
这样我们就可以在每个子类中使用。


假设我们现在有这样一个场景,从Activity1 (A1) 跳到 B1  然后 B1触发某个动作,  并且A1会立即得到 B1触发动作这个消息。


首先在 A1里 我们需要订阅唯一的 RxBus.

@Override
protected void onStart() {
    super.onStart();
    compositeSubscription = new CompositeSubscription();
    compositeSubscription.add(mRxBus
            .toObservable()
            .subscribe(new Action1<Object>() {
                @Override
                public void call(Object o) {
                    if (o instanceof xxx) {
                        // do something
                    }
                }
            }));
}
这里为什么我们会用 CompositeSubscription这个类?  如果我们还想要在该类里在订阅一个别的事件, 那么当onDestory的时候 会变的不好处理. CompositeSubscription 就相当于一个管理者.  当 onDestory时, 我们可以调用它的


compositeSubscription.unsubscribe(); //or  compositeSubscription.clear();
前者调用了的话, 那么该对象就变为不可用的状态, 除非你重新创建它.

并且,在这里你可以将你传递过来的参数用操作符来 操作它.


当我们在A1订阅好后, 我们 startActivity(B2).

在B2内我们只需要 点击一个按钮并且发送事件就可以了.


public void sub(View v) {
    
    mRxBus.send( xxx);
}
这里需要注意, 参数的类型 与接收的类型要一致, 否则会接收不到. 


这里只是简单阐述一下用法, 更多深层次的东西还需要大家去发掘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值