美文网首页
我学 rxjava 2(5)- RxBus

我学 rxjava 2(5)- RxBus

作者: 前行的乌龟 | 来源:发表于2018-04-25 19:22 被阅读55次

吐槽


必须吐槽下啊,一直以为 RxBus 是像 EventBus 一样是1个开源库呢,谁知道压根不是这么回事啊,RxBus 只是一个思路:用 rxjava 来实现一个 EventBus ,没有规范,标准的开源库,需要我们自己去写,不过好在这么久过去了,有一些大家都认可的写法,这里不是我的原创,我也是看别人的,总结下,代码不手写出来就永远不是你的。

开工


其实思路很简单的,EventBus 怎么设计咱就怎么设计。在 rxjava 中用到了 subject 用来进行热发射和 ofType 操作符

  • 热发射不熟悉的朋友可以看我的文章:我学 rxjava 2(3)- 热发射
  • ofType 操作符是filter + cast的组合,只发送特定的类型。fliter用来判断是否为指定的类型,cast将一个Observable转换为指定的特殊Observable

就这些了,其他的都算是代码封装中最简单的,单例模式。

代码


这是简单的不能再简单了,我就不特别去说了,大家自己领会

package com.bloodcrown.rxbus;

import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;
import io.reactivex.subjects.Subject;

/**
 * 作者 : BloodCrown
 * 时间 : 2018/4/25 下午1:00
 * 描述 :
 */

public class RxBus {

    public static volatile RxBus instance;

    private Subject<Object> bus;

    private RxBus() {
        bus = PublishSubject.create().toSerialized();
    }

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

    public void post(Object message) {
        bus.onNext(message);
    }

    public <T> Observable<T> setTag(Class<T> type) {
        return bus.ofType(type);
    }

    public boolean hasObserver() {
        return bus.hasObservers();
    }
}

使用页很简单,分步说一下

  1. 前置

管理 rxjava 管道对象

    private CompositeDisposable disposables;
  1. 注册
            catDisposable = RxBus.getInstance()
                    .setTag(new Cat().getClass())
                    .subscribe(new Consumer<Cat>() {
                        @Override
                        public void accept(Cat cat) throws Exception {
                            Toast.makeText(context, "数据2收到", Toast.LENGTH_SHORT).show();
                        }
                    });
            disposables.add(catDisposable);
  1. 解绑
        if (bookDisposable != null && !bookDisposable.isDisposed()) {
            bookDisposable.dispose();
        }

效果演示:


效果演示

好了,就这么多,看着很简单,大家手写一遍才真的行啊,练手很不错的,写完很有成就感

最后是本篇文章 demo:BW_RxBus

参考资料:


相关文章

网友评论

      本文标题:我学 rxjava 2(5)- RxBus

      本文链接:https://www.haomeiwen.com/subject/mdnylftx.html