RxBus

    xiaoxiao2021-03-25  140

    在讲解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(); } }
    转载请注明原文地址: https://ju.6miu.com/read-16000.html

    最新回复(0)