RxBus

在讲解RxBus之前先去解决几个问题。

1、Rxbus的概念

    乍一听上去,Rxbus是一个库,但是其实他并不是一个库,而是一种思想,利用RxJava中的subject来实现了类似于
OTTO或者EventBus的功能

2、其次为啥要用Rxjava去实现呢?

    现在很多项目中都在使用RxJava,利用RxJava去实现EventBus或者otto的相同功能,无疑不减少了第三方库的依赖
何乐而不为呢?


其实实现EventBus与otto相同的功能也不难,首先你需要去了解RxJava中的四种subject,下面的博客中有相关介绍

    RxJava Subject分析

假设你之前对RxJava的语法有所了解并已经看完了它的四种subject分析,我们接下来就动手去实现我们的RxBus.

RxBus.java:

private volatile static RxBus mRxBus = null;
/**
 * PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
 */

private Subject<Object, Object> mRxBusObserverable = new SerializedSubject<>(PublishSubject.create());

public static synchronized RxBus getInstance() {
    if (mRxBus == null) {
        synchronized (RxBus.class) {
            if (mRxBus == null) {
                mRxBus = new RxBus();
            }
        }
    }
    return mRxBus;
}

public void post(Object o) {
    mRxBusObserverable.onNext(o);
}

//根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable(Class<T> eventType) {
    return mRxBusObserverable.ofType(eventType);
}

/**
 * 判断是否有订阅者
 */
public boolean hasObservers() {
    return mRxBusObserverable.hasObservers();
}
使用方式:

发送事件的代码:

RxBus.getInstance().post(new Event(0));

Event是要发送的事件:

public class MessageInfo {
    private String message;
    private int flag;
    public MessageInfo(String message) {
        this.message = message;
    }
    public MessageInfo(int flag) {
        this.flag = flag;
    }
    public MessageInfo(String message, int flag) {
        this.message = message;
        this.flag = flag;
    }
    public String getMessage() {
        return message;
    }
    public int getFlag() {
        return flag;
    }
}

接受事件代码:

  Subscription subscription = RxBus.getInstance()
       .toObserverable(MessageInfo.class)
       .subscribe(new Action1() {
        @Override
        public void call(MessageInfo event) {
          String message = event.getMessage();
    }
  });

重点:
    一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。

@Override
protected void onDestroy() {
    super.onDestroy();
    if(!subscription.isUnsubscribed()) {
        subscription.unsubscribe();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值