RxBus 可用于组件通讯。
前面解说了eventBus的实现,注册、取消注册、发送消息,监听消息。
RxBus的实现
RxBus 并不是一个框架,而是一种使用 RxJava 实现事件总线的一种解决思路,实质是交由 RxJava 去实现。
1、依赖引入,module的build.gradle中
implementation 'io.reactivex.rxjava2:rxjava:2.1.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
2、RxBus的设计
PublishSubject: 只有在订阅后才接受处理消息,之前发送的消息不会到达接收者
public class RxBus {
private static volatile RxBus instance;
private final Subject<Object> _bus = PublishSubject.create();
public static RxBus getInstance() {
if (instance == null) {
synchronized (RxBus.class) {
if (instance == null) {
instance = new RxBus();
}
}
}
return instance;
}
public void send(Object obj) {
if (_bus.hasObservers()) {
_bus.onNext(obj);
}
}
public Observable<Object> toObservable() {
return _bus;
}
}
3、MainActivity 中发送消息、接收处理消息
//发送随机整数
sendEvent.setOnClickListener {
RxBus.getInstance().send(getRandomNumber())
}
//接收处理消息
RxBus.getInstance().toObservable()
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.e("zhen", "mainAcitivity subscribe ${Thread.currentThread().name}")
display.text = "$it observer"
}
RxJava会存在内存泄露的问题,RxBus只是借用RxJava实现的一套总线机制,所以也会存在内存泄露的问题。
如何验证是否RxBus会存在内存泄露的问题?
SecondActivity
//延时发送随机整数
sendEvent.setOnClickListener {
Thread(Runnable {
Thread.sleep(3000)
Log.e("zhen", "延时发送")
RxBus.getInstance().send(getRandomNumber())
}).start()
}
//监听rxBus的消息
RxBus.getInstance().toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// .compose(this.bindToLifecycle())
.subscribe {
Log.e("zhen", "SecondActivity subscribe ${Thread.currentThread().name}")
// display.text = "$it observer"
}
mainAcitivity 进入secondActivity,点击sendEvent发送消息,然后退出secondActivity。
这个时候secondActivity都退出了,还能监听到randomNumber
如何解决RxBus存在内存泄露的问题?
RxLifecycle 同样适用于RxBus解决内存泄露。
简单的实现方式就是:
1、引入依赖:module 的 build.gradle中,secondActivity继承自RxActivity,请求compose(this.bindToLifecycle()) 即可
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
怎么检测内存泄露呢?
leakCanary 会在debug环境下伴随我们的app生成一个leaks的app,监测内存泄露问题。