RxJava:RxBus事件总线

Photo by Peter Hershey on Unsplash

学习于:http://www.jianshu.com/p/ca090f6e2fe2
http://reactivex.io/documentation/subject.html

基于RxJava2,通过观察者模式实现页面之间的数据传递;

public class RxBus {

    private static volatile RxBus mInstance;
    private final Subject<Object> bus;
    public RxBus() {
        bus = PublishSubject.create().toSerialized();

    }
    // 单例RxBus
    public static RxBus getDefault() {
        if (mInstance == null) {
            synchronized (RxBus.class) {
                if (mInstance == null) {
                    mInstance = new RxBus();
                }
            }
        }
        return mInstance;
    }
    // 发送事件
    public void post(Object o) {
        bus.onNext(o);
    }
    public <T> Observable<T> toObservable(Class<T> eventType) {
        return bus.ofType(eventType);
    }
}

Subject:既作为Observer又作为Observable,并且提供了4种Subject
此处我们仅仅是简单的实现RxBus,所以使用PublishSubject
PublishSubject发送订阅之后的全部数据;

相同的是如果源Observable以错误终止,Subject则不会向随后的观察者发出任何项目,但会将简单地传递源Observable中的错误通知。

Subject是非线程安全的,为了在并发情况下只一个线程调用onNext()等方法,所以通过toSerialized()方法将Subject对象转换为SerializedSubject对象;

发送事件

    public void btn_2(View view) {
        RxBus.getDefault().post(new RxBusPostBean("whstywh", "18"));
    }

事件类

public class RxBusPostBean {
    private String name;
    private String age;

    public RxBusPostBean(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    
    public String getAge() {
        return age;
    }
}

接受事件

    private void getDataByRxBus() {
        mDisposable = RxBus.getDefault()
                .toObservable(RxBusPostBean.class)
                .subscribe(new Consumer<RxBusPostBean>() {
                    @Override
                    public void accept(RxBusPostBean rxBusPostBean) throws Exception {
                        mTextView1.setText(rxBusPostBean.getName());
                        mTextView2.setText(rxBusPostBean.getAge());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.d("flag", "throwable:" + throwable.getMessage());
                    }
                });
    }

在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (!mDisposable.isDisposed()) {
            mDisposable.dispose();
        }
    }

对于RxJava的学习才刚刚开始!
RxJava:RxBus事件总线
RxJava:RxBinding
RxJava:Rxlifecycle

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年...
    AFinalStone阅读 2,273评论 5 23
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善阅读 3,604评论 0 0
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,656评论 7 62
  • 作者寄语 很久之前就想写一个专题,专写Android开发框架,专题的名字叫 XXX 从入门到放弃 ,沉淀了这么久,...
    戴定康阅读 7,677评论 13 85
  • 远离尘嚣 怀揣一叠诗稿,走吧 在静谧的山里 读给身旁的石头听 饿了到丛林间觅食 采摘鲜美的野果 喝清澈的溪流 和自...
    陈清伟阅读 280评论 0 2