RxBus 简单分析

文章目录

      • RxBus的实现
      • 如何解决RxBus存在内存泄露的问题?

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,监测内存泄露问题。

你可能感兴趣的:(三方开源库)